├── python_boilerplate ├── core.py ├── __main__.py ├── __init__.py └── cli.py ├── tests └── test_core.py ├── docs ├── modules.rst ├── index.rst ├── Makefile ├── python_boilerplate.rst ├── make.bat └── conf.py ├── MANIFEST.in ├── tox.ini ├── setup.cfg ├── Pipfile ├── LICENSE ├── README.md ├── .gitignore ├── setup.py └── Pipfile.lock /python_boilerplate/core.py: -------------------------------------------------------------------------------- 1 | def add(x: int, y: int) -> int: 2 | return x + y 3 | -------------------------------------------------------------------------------- /python_boilerplate/__main__.py: -------------------------------------------------------------------------------- 1 | if __name__ == '__main__': 2 | from .cli import main 3 | main() 4 | -------------------------------------------------------------------------------- /python_boilerplate/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = '2.0.0' 2 | 3 | from .core import add 4 | 5 | __all__ = ['add'] 6 | -------------------------------------------------------------------------------- /tests/test_core.py: -------------------------------------------------------------------------------- 1 | from python_boilerplate import add 2 | 3 | 4 | def test_add(): 5 | assert add(1, 1) == 2 6 | -------------------------------------------------------------------------------- /docs/modules.rst: -------------------------------------------------------------------------------- 1 | python_boilerplate 2 | ================== 3 | 4 | .. toctree:: 5 | :maxdepth: 4 6 | 7 | python_boilerplate 8 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include tox.ini 2 | 3 | graft tests 4 | graft examples 5 | graft docs 6 | 7 | global-exclude *.py[co] 8 | 9 | prune docs/_build 10 | prune docs/_themes 11 | -------------------------------------------------------------------------------- /python_boilerplate/cli.py: -------------------------------------------------------------------------------- 1 | def main() -> None: 2 | import sys 3 | from .core import add 4 | if len(sys.argv) == 3: 5 | x, y = map(int, sys.argv[1:]) 6 | print(add(x, y)) 7 | else: 8 | print('please specify 2 arguments', file=sys.stderr) 9 | sys.exit(1) 10 | 11 | 12 | if __name__ == '__main__': 13 | main() 14 | -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = 3 | py{37,36,35,34} 4 | coverage-report 5 | skip_missing_interpreters = true 6 | 7 | [testenv] 8 | passenv = LANG 9 | deps = 10 | pytest>=3 11 | coverage 12 | commands = 13 | coverage run -p -m pytest tests 14 | 15 | [testenv:coverage-report] 16 | deps = coverage 17 | skip_install = true 18 | commands = 19 | coverage combine 20 | coverage report 21 | coverage html 22 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [tool:pytest] 2 | minversion = 3.0 3 | testpaths = tests 4 | 5 | [coverage:run] 6 | branch = True 7 | source = 8 | python_boilerplate 9 | tests 10 | 11 | [coverage:paths] 12 | source = 13 | python_boilerplate 14 | .tox/*/lib/python*/site-packages/python_boilerplate 15 | 16 | [mypy] 17 | ignore_missing_imports = True 18 | 19 | [flake8] 20 | exclude = .git, .tox, .venv, .eggs, build, dist, docs 21 | max-line-length = 120 22 | 23 | [isort] 24 | line_length = 120 25 | skip = .git, .tox, .venv, .eggs, build, dist, docs 26 | -------------------------------------------------------------------------------- /Pipfile: -------------------------------------------------------------------------------- 1 | [[source]] 2 | url = "https://pypi.org/simple" 3 | name = "pypi" 4 | verify_ssl = true 5 | 6 | [requires] 7 | # python_version = "3.4" 8 | 9 | [packages] 10 | 11 | [dev-packages] 12 | python-boilerplate = {path = ".", editable = true} 13 | pytest = ">=3" 14 | coverage = "*" 15 | tox = "*" 16 | sphinx = "*" 17 | mypy = "*" 18 | "flake8" = "*" 19 | "autopep8" = "*" 20 | isort = "*" 21 | 22 | [scripts] 23 | vet = "python setup.py vet" 24 | fmt = "python setup.py fmt" 25 | doc = "python setup.py doc" 26 | build = "python setup.py bdist_wheel" 27 | -------------------------------------------------------------------------------- /docs/index.rst: -------------------------------------------------------------------------------- 1 | .. python_boilerplate documentation master file, created by 2 | sphinx-quickstart on Tue Nov 13 12:40:09 2018. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to python_boilerplate's documentation! 7 | ============================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 4 11 | :caption: Contents: 12 | 13 | python_boilerplate 14 | 15 | 16 | Indices and tables 17 | ================== 18 | 19 | * :ref:`genindex` 20 | * :ref:`modindex` 21 | * :ref:`search` 22 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line. 5 | SPHINXOPTS = 6 | SPHINXBUILD = sphinx-build 7 | SOURCEDIR = . 8 | BUILDDIR = _build 9 | 10 | # Put it first so that "make" without argument is like "make help". 11 | help: 12 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 13 | 14 | .PHONY: help Makefile 15 | 16 | # Catch-all target: route all unknown targets to Sphinx using the new 17 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 18 | %: Makefile 19 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) -------------------------------------------------------------------------------- /docs/python_boilerplate.rst: -------------------------------------------------------------------------------- 1 | python\_boilerplate package 2 | =========================== 3 | 4 | Submodules 5 | ---------- 6 | 7 | python\_boilerplate.cli module 8 | ------------------------------ 9 | 10 | .. automodule:: python_boilerplate.cli 11 | :members: 12 | :undoc-members: 13 | :show-inheritance: 14 | 15 | python\_boilerplate.core module 16 | ------------------------------- 17 | 18 | .. automodule:: python_boilerplate.core 19 | :members: 20 | :undoc-members: 21 | :show-inheritance: 22 | 23 | 24 | Module contents 25 | --------------- 26 | 27 | .. automodule:: python_boilerplate 28 | :members: 29 | :undoc-members: 30 | :show-inheritance: 31 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=. 11 | set BUILDDIR=_build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # python-boilerplate 2 | 3 | * [Pythonのパッケージングのベストプラクティスについて考える2018](https://techblog.asahi-net.co.jp/entry/2018/06/15/162951) 4 | * [2019年に向けてPythonのモダンな開発環境について考える](https://techblog.asahi-net.co.jp/entry/2018/11/19/103455) 5 | 6 | Please rename this package: 7 | 8 | ```sh 9 | PACKAGE_NAME=foobar 10 | git ls-files | xargs sed -i "s/python_boilerplate/${PACKAGE_NAME}/g" 11 | mv python_boilerplate "$PACKAGE_NAME" 12 | rm -rf .git 13 | ``` 14 | 15 | ## Create and activate venv 16 | 17 | ```sh 18 | python3 -m venv .venv 19 | source .venv/bin/activate 20 | ``` 21 | 22 | ## Install 23 | 24 | ```sh 25 | pip install . 26 | ``` 27 | 28 | ## Upgrade 29 | 30 | ```sh 31 | pip install -U . # or --upgrade 32 | ``` 33 | 34 | ## Import this library 35 | 36 | (Python) 37 | 38 | ```python 39 | import python_boilerplate 40 | print(python_boilerplate.add(1, 1)) # => 2 41 | ``` 42 | 43 | ## Execute this application 44 | 45 | ```sh 46 | python-boilerplate 1 1 47 | ``` 48 | 49 | ## Create a source distribution 50 | 51 | ```sh 52 | python setup.py sdist 53 | ``` 54 | 55 | ## Create a wheel package 56 | 57 | ```sh 58 | pip install wheel 59 | python setup.py bdist_wheel 60 | ``` 61 | 62 | ## Install (for developer) 63 | 64 | ```sh 65 | PIPENV_VENV_IN_PROJECT=true pipenv install -d 66 | ``` 67 | 68 | ## Test 69 | 70 | ```sh 71 | pipenv run pytest 72 | ``` 73 | 74 | ## Test against multiple environments 75 | 76 | ```sh 77 | pipenv run tox 78 | ``` 79 | 80 | ## Lint 81 | 82 | ```sh 83 | pipenv run vet 84 | ``` 85 | 86 | ## Reformat source code 87 | 88 | ```sh 89 | pipenv run fmt 90 | ``` 91 | 92 | ## Generate documents 93 | 94 | ```sh 95 | pipenv run doc 96 | ``` 97 | 98 | ## Create a wheel package (for developer) 99 | 100 | ```sh 101 | pipenv run build 102 | ``` 103 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | MANIFEST 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .nox/ 42 | .coverage 43 | .coverage.* 44 | .cache 45 | nosetests.xml 46 | coverage.xml 47 | *.cover 48 | .hypothesis/ 49 | .pytest_cache/ 50 | 51 | # Translations 52 | *.mo 53 | *.pot 54 | 55 | # Django stuff: 56 | *.log 57 | local_settings.py 58 | db.sqlite3 59 | 60 | # Flask stuff: 61 | instance/ 62 | .webassets-cache 63 | 64 | # Scrapy stuff: 65 | .scrapy 66 | 67 | # Sphinx documentation 68 | docs/_build/ 69 | 70 | # PyBuilder 71 | target/ 72 | 73 | # Jupyter Notebook 74 | .ipynb_checkpoints 75 | 76 | # IPython 77 | profile_default/ 78 | ipython_config.py 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # SageMath parsed files 87 | *.sage.py 88 | 89 | # Environments 90 | .env 91 | .venv 92 | env/ 93 | venv/ 94 | ENV/ 95 | env.bak/ 96 | venv.bak/ 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # mkdocs documentation 106 | /site 107 | 108 | # mypy 109 | .mypy_cache/ 110 | .dmypy.json 111 | dmypy.json 112 | 113 | # Pyre type checker 114 | .pyre/ 115 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import ast 2 | import os 3 | import re 4 | import subprocess 5 | 6 | from setuptools import Command, setup 7 | 8 | PACKAGE_NAME = 'python_boilerplate' 9 | 10 | with open(os.path.join(PACKAGE_NAME, '__init__.py')) as f: 11 | match = re.search(r'__version__\s+=\s+(.*)', f.read()) 12 | version = str(ast.literal_eval(match.group(1))) 13 | 14 | 15 | class SimpleCommand(Command): 16 | user_options = [] 17 | 18 | def initialize_options(self): 19 | pass 20 | 21 | def finalize_options(self): 22 | pass 23 | 24 | 25 | class VetCommand(SimpleCommand): 26 | def run(self): 27 | subprocess.check_call(["mypy", PACKAGE_NAME]) 28 | subprocess.check_call(["flake8"]) 29 | 30 | 31 | class FmtCommand(SimpleCommand): 32 | def run(self): 33 | subprocess.call(["isort", "-y"]) 34 | subprocess.call(["autopep8", "-ri", PACKAGE_NAME, "tests", "setup.py"]) 35 | 36 | 37 | class DocCommand(SimpleCommand): 38 | def run(self): 39 | opt = "-f" if os.path.exists(os.path.join("docs", "conf.py")) else "-F" 40 | subprocess.call(["sphinx-apidoc", opt, "-o", "docs", PACKAGE_NAME]) 41 | if os.name == 'nt': 42 | subprocess.call([os.path.join("docs", "make.bat"), "html"]) # for Windows 43 | else: 44 | subprocess.call(["make", "-C", "docs", "html"]) 45 | 46 | 47 | setup( 48 | # metadata 49 | name=PACKAGE_NAME, 50 | version=version, 51 | 52 | # options 53 | packages=[PACKAGE_NAME], 54 | include_package_data=True, 55 | zip_safe=False, 56 | python_requires='>=3.4', 57 | install_requires=[ 58 | 'typing; python_version<"3.5"', 59 | ], 60 | entry_points=''' 61 | [console_scripts] 62 | {app}={pkg}.cli:main 63 | '''.format(app=PACKAGE_NAME.replace('_', '-'), pkg=PACKAGE_NAME), 64 | cmdclass={ 65 | "vet": VetCommand, 66 | "fmt": FmtCommand, 67 | "doc": DocCommand, 68 | }, 69 | ) 70 | -------------------------------------------------------------------------------- /docs/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Configuration file for the Sphinx documentation builder. 4 | # 5 | # This file does only contain a selection of the most common options. For a 6 | # full list see the documentation: 7 | # http://www.sphinx-doc.org/en/master/config 8 | 9 | # -- Path setup -------------------------------------------------------------- 10 | 11 | # If extensions (or modules to document with autodoc) are in another directory, 12 | # add these directories to sys.path here. If the directory is relative to the 13 | # documentation root, use os.path.abspath to make it absolute, like shown here. 14 | # 15 | # import os 16 | # import sys 17 | # sys.path.insert(0, '/home/ml/work/py/python-boilerplate/python_boilerplate') 18 | 19 | 20 | # -- Project information ----------------------------------------------------- 21 | 22 | project = 'python_boilerplate' 23 | copyright = '2018, Author' 24 | author = 'Author' 25 | 26 | # The short X.Y version 27 | version = '' 28 | # The full version, including alpha/beta/rc tags 29 | release = '' 30 | 31 | 32 | # -- General configuration --------------------------------------------------- 33 | 34 | # If your documentation needs a minimal Sphinx version, state it here. 35 | # 36 | # needs_sphinx = '1.0' 37 | 38 | # Add any Sphinx extension module names here, as strings. They can be 39 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 40 | # ones. 41 | extensions = [ 42 | 'sphinx.ext.autodoc', 43 | 'sphinx.ext.viewcode', 44 | 'sphinx.ext.todo', 45 | ] 46 | 47 | # Add any paths that contain templates here, relative to this directory. 48 | templates_path = ['_templates'] 49 | 50 | # The suffix(es) of source filenames. 51 | # You can specify multiple suffix as a list of string: 52 | # 53 | # source_suffix = ['.rst', '.md'] 54 | source_suffix = '.rst' 55 | 56 | # The master toctree document. 57 | master_doc = 'index' 58 | 59 | # The language for content autogenerated by Sphinx. Refer to documentation 60 | # for a list of supported languages. 61 | # 62 | # This is also used if you do content translation via gettext catalogs. 63 | # Usually you set "language" from the command line for these cases. 64 | language = 'en' 65 | 66 | # List of patterns, relative to source directory, that match files and 67 | # directories to ignore when looking for source files. 68 | # This pattern also affects html_static_path and html_extra_path. 69 | exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] 70 | 71 | # The name of the Pygments (syntax highlighting) style to use. 72 | pygments_style = None 73 | 74 | 75 | # -- Options for HTML output ------------------------------------------------- 76 | 77 | # The theme to use for HTML and HTML Help pages. See the documentation for 78 | # a list of builtin themes. 79 | # 80 | html_theme = 'alabaster' 81 | 82 | # Theme options are theme-specific and customize the look and feel of a theme 83 | # further. For a list of options available for each theme, see the 84 | # documentation. 85 | # 86 | # html_theme_options = {} 87 | 88 | # Add any paths that contain custom static files (such as style sheets) here, 89 | # relative to this directory. They are copied after the builtin static files, 90 | # so a file named "default.css" will overwrite the builtin "default.css". 91 | html_static_path = ['_static'] 92 | 93 | # Custom sidebar templates, must be a dictionary that maps document names 94 | # to template names. 95 | # 96 | # The default sidebars (for documents that don't match any pattern) are 97 | # defined by theme itself. Builtin themes are using these templates by 98 | # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', 99 | # 'searchbox.html']``. 100 | # 101 | # html_sidebars = {} 102 | 103 | 104 | # -- Options for HTMLHelp output --------------------------------------------- 105 | 106 | # Output file base name for HTML help builder. 107 | htmlhelp_basename = 'python_boilerplatedoc' 108 | 109 | 110 | # -- Options for LaTeX output ------------------------------------------------ 111 | 112 | latex_elements = { 113 | # The paper size ('letterpaper' or 'a4paper'). 114 | # 115 | # 'papersize': 'letterpaper', 116 | 117 | # The font size ('10pt', '11pt' or '12pt'). 118 | # 119 | # 'pointsize': '10pt', 120 | 121 | # Additional stuff for the LaTeX preamble. 122 | # 123 | # 'preamble': '', 124 | 125 | # Latex figure (float) alignment 126 | # 127 | # 'figure_align': 'htbp', 128 | } 129 | 130 | # Grouping the document tree into LaTeX files. List of tuples 131 | # (source start file, target name, title, 132 | # author, documentclass [howto, manual, or own class]). 133 | latex_documents = [ 134 | (master_doc, 'python_boilerplate.tex', 'python\\_boilerplate Documentation', 135 | 'Author', 'manual'), 136 | ] 137 | 138 | 139 | # -- Options for manual page output ------------------------------------------ 140 | 141 | # One entry per manual page. List of tuples 142 | # (source start file, name, description, authors, manual section). 143 | man_pages = [ 144 | (master_doc, 'python_boilerplate', 'python_boilerplate Documentation', 145 | [author], 1) 146 | ] 147 | 148 | 149 | # -- Options for Texinfo output ---------------------------------------------- 150 | 151 | # Grouping the document tree into Texinfo files. List of tuples 152 | # (source start file, target name, title, author, 153 | # dir menu entry, description, category) 154 | texinfo_documents = [ 155 | (master_doc, 'python_boilerplate', 'python_boilerplate Documentation', 156 | author, 'python_boilerplate', 'One line description of project.', 157 | 'Miscellaneous'), 158 | ] 159 | 160 | 161 | # -- Options for Epub output ------------------------------------------------- 162 | 163 | # Bibliographic Dublin Core info. 164 | epub_title = project 165 | 166 | # The unique identifier of the text. This can be a ISBN number 167 | # or the project homepage. 168 | # 169 | # epub_identifier = '' 170 | 171 | # A unique identification for the text. 172 | # 173 | # epub_uid = '' 174 | 175 | # A list of files that should not be packed into the epub file. 176 | epub_exclude_files = ['search.html'] 177 | 178 | 179 | # -- Extension configuration ------------------------------------------------- 180 | 181 | # -- Options for todo extension ---------------------------------------------- 182 | 183 | # If true, `todo` and `todoList` produce output, else they produce nothing. 184 | todo_include_todos = True -------------------------------------------------------------------------------- /Pipfile.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_meta": { 3 | "hash": { 4 | "sha256": "ada3f5d3c100197f481b51c2e16fdc496a1580f6862c563425401c4649784fd5" 5 | }, 6 | "pipfile-spec": 6, 7 | "requires": {}, 8 | "sources": [ 9 | { 10 | "name": "pypi", 11 | "url": "https://pypi.org/simple", 12 | "verify_ssl": true 13 | } 14 | ] 15 | }, 16 | "default": {}, 17 | "develop": { 18 | "alabaster": { 19 | "hashes": [ 20 | "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359", 21 | "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02" 22 | ], 23 | "version": "==0.7.12" 24 | }, 25 | "atomicwrites": { 26 | "hashes": [ 27 | "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", 28 | "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" 29 | ], 30 | "version": "==1.3.0" 31 | }, 32 | "attrs": { 33 | "hashes": [ 34 | "sha256:69c0dbf2ed392de1cb5ec704444b08a5ef81680a61cb899dc08127123af36a79", 35 | "sha256:f0b870f674851ecbfbbbd364d6b5cbdff9dcedbc7f3f5e18a6891057f21fe399" 36 | ], 37 | "version": "==19.1.0" 38 | }, 39 | "autopep8": { 40 | "hashes": [ 41 | "sha256:4d8eec30cc81bc5617dbf1218201d770dc35629363547f17577c61683ccfb3ee" 42 | ], 43 | "index": "pypi", 44 | "version": "==1.4.4" 45 | }, 46 | "babel": { 47 | "hashes": [ 48 | "sha256:6778d85147d5d85345c14a26aada5e478ab04e39b078b0745ee6870c2b5cf669", 49 | "sha256:8cba50f48c529ca3fa18cf81fa9403be176d374ac4d60738b839122dfaaa3d23" 50 | ], 51 | "version": "==2.6.0" 52 | }, 53 | "certifi": { 54 | "hashes": [ 55 | "sha256:59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", 56 | "sha256:b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae" 57 | ], 58 | "version": "==2019.3.9" 59 | }, 60 | "chardet": { 61 | "hashes": [ 62 | "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", 63 | "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691" 64 | ], 65 | "version": "==3.0.4" 66 | }, 67 | "coverage": { 68 | "hashes": [ 69 | "sha256:3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9", 70 | "sha256:39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74", 71 | "sha256:3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390", 72 | "sha256:465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8", 73 | "sha256:48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe", 74 | "sha256:5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf", 75 | "sha256:5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e", 76 | "sha256:68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741", 77 | "sha256:6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09", 78 | "sha256:7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd", 79 | "sha256:7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034", 80 | "sha256:839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420", 81 | "sha256:8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c", 82 | "sha256:932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab", 83 | "sha256:988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba", 84 | "sha256:998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e", 85 | "sha256:9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609", 86 | "sha256:9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2", 87 | "sha256:a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49", 88 | "sha256:a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b", 89 | "sha256:aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d", 90 | "sha256:bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce", 91 | "sha256:bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9", 92 | "sha256:c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4", 93 | "sha256:c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773", 94 | "sha256:c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723", 95 | "sha256:df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c", 96 | "sha256:f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f", 97 | "sha256:f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1", 98 | "sha256:f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260", 99 | "sha256:fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a" 100 | ], 101 | "index": "pypi", 102 | "version": "==4.5.3" 103 | }, 104 | "docutils": { 105 | "hashes": [ 106 | "sha256:02aec4bd92ab067f6ff27a38a38a41173bf01bed8f89157768c1573f53e474a6", 107 | "sha256:51e64ef2ebfb29cae1faa133b3710143496eca21c530f3f71424d77687764274", 108 | "sha256:7a4bd47eaf6596e1295ecb11361139febe29b084a87bf005bf899f9a42edc3c6" 109 | ], 110 | "version": "==0.14" 111 | }, 112 | "entrypoints": { 113 | "hashes": [ 114 | "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", 115 | "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" 116 | ], 117 | "version": "==0.3" 118 | }, 119 | "filelock": { 120 | "hashes": [ 121 | "sha256:b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633", 122 | "sha256:d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6" 123 | ], 124 | "version": "==3.0.10" 125 | }, 126 | "flake8": { 127 | "hashes": [ 128 | "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", 129 | "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" 130 | ], 131 | "index": "pypi", 132 | "version": "==3.7.7" 133 | }, 134 | "idna": { 135 | "hashes": [ 136 | "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", 137 | "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c" 138 | ], 139 | "version": "==2.8" 140 | }, 141 | "imagesize": { 142 | "hashes": [ 143 | "sha256:3f349de3eb99145973fefb7dbe38554414e5c30abd0c8e4b970a7c9d09f3a1d8", 144 | "sha256:f3832918bc3c66617f92e35f5d70729187676313caa60c187eb0f28b8fe5e3b5" 145 | ], 146 | "version": "==1.1.0" 147 | }, 148 | "isort": { 149 | "hashes": [ 150 | "sha256:01cb7e1ca5e6c5b3f235f0385057f70558b70d2f00320208825fa62887292f43", 151 | "sha256:268067462aed7eb2a1e237fcb287852f22077de3fb07964e87e00f829eea2d1a" 152 | ], 153 | "index": "pypi", 154 | "version": "==4.3.17" 155 | }, 156 | "jinja2": { 157 | "hashes": [ 158 | "sha256:065c4f02ebe7f7cf559e49ee5a95fb800a9e4528727aec6f24402a5374c65013", 159 | "sha256:14dd6caf1527abb21f08f86c784eac40853ba93edb79552aa1e4b8aef1b61c7b" 160 | ], 161 | "version": "==2.10.1" 162 | }, 163 | "markupsafe": { 164 | "hashes": [ 165 | "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", 166 | "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", 167 | "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", 168 | "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", 169 | "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", 170 | "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", 171 | "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", 172 | "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", 173 | "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", 174 | "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", 175 | "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", 176 | "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", 177 | "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", 178 | "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", 179 | "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", 180 | "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", 181 | "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", 182 | "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", 183 | "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", 184 | "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", 185 | "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", 186 | "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", 187 | "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", 188 | "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", 189 | "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", 190 | "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", 191 | "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", 192 | "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7" 193 | ], 194 | "version": "==1.1.1" 195 | }, 196 | "mccabe": { 197 | "hashes": [ 198 | "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", 199 | "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" 200 | ], 201 | "version": "==0.6.1" 202 | }, 203 | "more-itertools": { 204 | "hashes": [ 205 | "sha256:2112d2ca570bb7c3e53ea1a35cd5df42bb0fd10c45f0fb97178679c3c03d64c7", 206 | "sha256:c3e4748ba1aad8dba30a4886b0b1a2004f9a863837b8654e7059eebf727afa5a" 207 | ], 208 | "markers": "python_version > '2.7'", 209 | "version": "==7.0.0" 210 | }, 211 | "mypy": { 212 | "hashes": [ 213 | "sha256:03261a04ace27250cf14f1301969e2cc36ad0343dd437e60007ce42f06ddbaff", 214 | "sha256:6a7923e90dd8f8b8e762327e3a4dd814f0bc5581a627010f4e2ec72d906ada0f", 215 | "sha256:6a7c2b16ff7dee1cd4a913641d6a8da0cd386be812524f41427ea25f8fe337a6", 216 | "sha256:7480db0bc2bb473547c8d519ea549de9f9654170e6f5b34310094ebe5ee1c9dc", 217 | "sha256:863774c896f2cdc62a0e2252e9ba7aaeb7da04c0296f47c82b125dce3437c580", 218 | "sha256:9a990cf039891a83ee90f130256cc06d09c0793242ea38d0fe33fdc449507123", 219 | "sha256:b03573d0cd8c051aa9ef7f47d564cf44bbc5e91e89a7a078b3ca904b3da8855a", 220 | "sha256:b10b16d9aa7a01266f14260344fb25849ef0d508c512a916043f77987489aeff", 221 | "sha256:b1eab82221c3cc94bf22152e701b3efc9d64f60fac4cab20969a0427e5a78261", 222 | "sha256:e663d4424531dc99fb85c947df8a4a107442f53f20a4e0bcefaa1d21c87e1563", 223 | "sha256:ffac30f3fa2c9e10118cbb0faa0b7da7edb6e3c24a4048a15446a1f3409884e3" 224 | ], 225 | "index": "pypi", 226 | "version": "==0.700" 227 | }, 228 | "mypy-extensions": { 229 | "hashes": [ 230 | "sha256:37e0e956f41369209a3d5f34580150bcacfabaa57b33a15c0b25f4b5725e0812", 231 | "sha256:b16cabe759f55e3409a7d231ebd2841378fb0c27a5d1994719e340e4f429ac3e" 232 | ], 233 | "version": "==0.4.1" 234 | }, 235 | "packaging": { 236 | "hashes": [ 237 | "sha256:0c98a5d0be38ed775798ece1b9727178c4469d9c3b4ada66e8e6b7849f8732af", 238 | "sha256:9e1cbf8c12b1f1ce0bb5344b8d7ecf66a6f8a6e91bcb0c84593ed6d3ab5c4ab3" 239 | ], 240 | "version": "==19.0" 241 | }, 242 | "pluggy": { 243 | "hashes": [ 244 | "sha256:19ecf9ce9db2fce065a7a0586e07cfb4ac8614fe96edf628a264b1c70116cf8f", 245 | "sha256:84d306a647cc805219916e62aab89caa97a33a1dd8c342e87a37f91073cd4746" 246 | ], 247 | "version": "==0.9.0" 248 | }, 249 | "py": { 250 | "hashes": [ 251 | "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", 252 | "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" 253 | ], 254 | "version": "==1.8.0" 255 | }, 256 | "pycodestyle": { 257 | "hashes": [ 258 | "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", 259 | "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" 260 | ], 261 | "version": "==2.5.0" 262 | }, 263 | "pyflakes": { 264 | "hashes": [ 265 | "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", 266 | "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" 267 | ], 268 | "version": "==2.1.1" 269 | }, 270 | "pygments": { 271 | "hashes": [ 272 | "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", 273 | "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" 274 | ], 275 | "version": "==2.3.1" 276 | }, 277 | "pyparsing": { 278 | "hashes": [ 279 | "sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", 280 | "sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" 281 | ], 282 | "version": "==2.4.0" 283 | }, 284 | "pytest": { 285 | "hashes": [ 286 | "sha256:13c5e9fb5ec5179995e9357111ab089af350d788cbc944c628f3cde72285809b", 287 | "sha256:f21d2f1fb8200830dcbb5d8ec466a9c9120e20d8b53c7585d180125cce1d297a" 288 | ], 289 | "index": "pypi", 290 | "version": "==4.4.0" 291 | }, 292 | "python-boilerplate": { 293 | "editable": true, 294 | "path": "." 295 | }, 296 | "pytz": { 297 | "hashes": [ 298 | "sha256:303879e36b721603cc54604edcac9d20401bdbe31e1e4fdee5b9f98d5d31dfda", 299 | "sha256:d747dd3d23d77ef44c6a3526e274af6efeb0a6f1afd5a69ba4d5be4098c8e141" 300 | ], 301 | "version": "==2019.1" 302 | }, 303 | "requests": { 304 | "hashes": [ 305 | "sha256:502a824f31acdacb3a35b6690b5fbf0bc41d63a24a45c4004352b0242707598e", 306 | "sha256:7bf2a778576d825600030a110f3c0e3e8edc51dfaafe1c146e39a2027784957b" 307 | ], 308 | "version": "==2.21.0" 309 | }, 310 | "six": { 311 | "hashes": [ 312 | "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", 313 | "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" 314 | ], 315 | "version": "==1.12.0" 316 | }, 317 | "snowballstemmer": { 318 | "hashes": [ 319 | "sha256:919f26a68b2c17a7634da993d91339e288964f93c274f1343e3bbbe2096e1128", 320 | "sha256:9f3bcd3c401c3e862ec0ebe6d2c069ebc012ce142cce209c098ccb5b09136e89" 321 | ], 322 | "version": "==1.2.1" 323 | }, 324 | "sphinx": { 325 | "hashes": [ 326 | "sha256:423280646fb37944dd3c85c58fb92a20d745793a9f6c511f59da82fa97cd404b", 327 | "sha256:de930f42600a4fef993587633984cc5027dedba2464bcf00ddace26b40f8d9ce" 328 | ], 329 | "index": "pypi", 330 | "version": "==2.0.1" 331 | }, 332 | "sphinxcontrib-applehelp": { 333 | "hashes": [ 334 | "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897", 335 | "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d" 336 | ], 337 | "version": "==1.0.1" 338 | }, 339 | "sphinxcontrib-devhelp": { 340 | "hashes": [ 341 | "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34", 342 | "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981" 343 | ], 344 | "version": "==1.0.1" 345 | }, 346 | "sphinxcontrib-htmlhelp": { 347 | "hashes": [ 348 | "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422", 349 | "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7" 350 | ], 351 | "version": "==1.0.2" 352 | }, 353 | "sphinxcontrib-jsmath": { 354 | "hashes": [ 355 | "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", 356 | "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" 357 | ], 358 | "version": "==1.0.1" 359 | }, 360 | "sphinxcontrib-qthelp": { 361 | "hashes": [ 362 | "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20", 363 | "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f" 364 | ], 365 | "version": "==1.0.2" 366 | }, 367 | "sphinxcontrib-serializinghtml": { 368 | "hashes": [ 369 | "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227", 370 | "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768" 371 | ], 372 | "version": "==1.1.3" 373 | }, 374 | "toml": { 375 | "hashes": [ 376 | "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c", 377 | "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e" 378 | ], 379 | "version": "==0.10.0" 380 | }, 381 | "tox": { 382 | "hashes": [ 383 | "sha256:69620e19de33a6b7ee8aeda5478791b3618ff58f0b869dbd0319fb71aa903deb", 384 | "sha256:e5cdb1653aa27b3e46b5c390de6b6d51d31afcfdbd9d1222d82d76b82ad03d9b" 385 | ], 386 | "index": "pypi", 387 | "version": "==3.8.6" 388 | }, 389 | "typed-ast": { 390 | "hashes": [ 391 | "sha256:035a54ede6ce1380599b2ce57844c6554666522e376bd111eb940fbc7c3dad23", 392 | "sha256:037c35f2741ce3a9ac0d55abfcd119133cbd821fffa4461397718287092d9d15", 393 | "sha256:049feae7e9f180b64efacbdc36b3af64a00393a47be22fa9cb6794e68d4e73d3", 394 | "sha256:19228f7940beafc1ba21a6e8e070e0b0bfd1457902a3a81709762b8b9039b88d", 395 | "sha256:2ea681e91e3550a30c2265d2916f40a5f5d89b59469a20f3bad7d07adee0f7a6", 396 | "sha256:3a6b0a78af298d82323660df5497bcea0f0a4a25a0b003afd0ce5af049bd1f60", 397 | "sha256:5385da8f3b801014504df0852bf83524599df890387a3c2b17b7caa3d78b1773", 398 | "sha256:606d8afa07eef77280c2bf84335e24390055b478392e1975f96286d99d0cb424", 399 | "sha256:69245b5b23bbf7fb242c9f8f08493e9ecd7711f063259aefffaeb90595d62287", 400 | "sha256:6f6d839ab09830d59b7fa8fb6917023d8cb5498ee1f1dbd82d37db78eb76bc99", 401 | "sha256:730888475f5ac0e37c1de4bd05eeb799fdb742697867f524dc8a4cd74bcecc23", 402 | "sha256:9819b5162ffc121b9e334923c685b0d0826154e41dfe70b2ede2ce29034c71d8", 403 | "sha256:9e60ef9426efab601dd9aa120e4ff560f4461cf8442e9c0a2b92548d52800699", 404 | "sha256:af5fbdde0690c7da68e841d7fc2632345d570768ea7406a9434446d7b33b0ee1", 405 | "sha256:b64efdbdf3bbb1377562c179f167f3bf301251411eb5ac77dec6b7d32bcda463", 406 | "sha256:bac5f444c118aeb456fac1b0b5d14c6a71ea2a42069b09c176f75e9bd4c186f6", 407 | "sha256:bda9068aafb73859491e13b99b682bd299c1b5fd50644d697533775828a28ee0", 408 | "sha256:d659517ca116e6750101a1326107d3479028c5191f0ecee3c7203c50f5b915b0", 409 | "sha256:eddd3fb1f3e0f82e5915a899285a39ee34ce18fd25d89582bc89fc9fb16cd2c6" 410 | ], 411 | "version": "==1.3.1" 412 | }, 413 | "urllib3": { 414 | "hashes": [ 415 | "sha256:61bf29cada3fc2fbefad4fdf059ea4bd1b4a86d2b6d15e1c7c0b582b9752fe39", 416 | "sha256:de9529817c93f27c8ccbfead6985011db27bd0ddfcdb2d86f3f663385c6a9c22" 417 | ], 418 | "version": "==1.24.1" 419 | }, 420 | "virtualenv": { 421 | "hashes": [ 422 | "sha256:6aebaf4dd2568a0094225ebbca987859e369e3e5c22dc7d52e5406d504890417", 423 | "sha256:984d7e607b0a5d1329425dd8845bd971b957424b5ba664729fab51ab8c11bc39" 424 | ], 425 | "version": "==16.4.3" 426 | } 427 | } 428 | } 429 | --------------------------------------------------------------------------------