diff --git a/celery-rabbit-example/.gitignore b/celery-rabbit-example/.gitignore deleted file mode 100644 index 8e0776e..0000000 --- a/celery-rabbit-example/.gitignore +++ /dev/null @@ -1 +0,0 @@ -!.env diff --git a/celery-rabbit-example/Dockerfile b/celery-rabbit-example/Dockerfile deleted file mode 100644 index f2b4d46..0000000 --- a/celery-rabbit-example/Dockerfile +++ /dev/null @@ -1,34 +0,0 @@ -FROM python:3.8.6-buster - -ENV PYTHONFAULTHANDLER=1 \ - PYTHONUNBUFFERED=1 \ - PYTHONHASHSEED=random \ - PYTHONDONTWRITEBYTECODE=1 \ - # pip: - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 - -RUN apt-get update \ - && apt-get install --no-install-recommends -y \ - bash \ - build-essential \ - curl \ - gettext \ - git \ - libpq-dev \ - nano - -WORKDIR /code - -# Copy and install dependencies: -COPY requirements.txt /code/ -RUN python -m pip install --upgrade pip -RUN pip install --no-cache-dir -r /code/requirements.txt - -# Copy source files: -COPY . /code/ -# COPY app.py /code/ - - - diff --git a/celery-rabbit-example/README.md b/celery-rabbit-example/README.md deleted file mode 100644 index 792d838..0000000 --- a/celery-rabbit-example/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# celery first example - -Steps: -1. Run `docker-compose up` -2. Show logs -3. In a new terminal run `docker-compose exec worker python` diff --git a/celery-rabbit-example/celery_config/__init__.py b/celery-rabbit-example/celery_config/__init__.py deleted file mode 100644 index d5dc429..0000000 --- a/celery-rabbit-example/celery_config/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -# from app_celery import app as my_celery_app -# -# __all__ = ('my_celery_app', ) diff --git a/celery-rabbit-example/celery_config/app_celery.py b/celery-rabbit-example/celery_config/app_celery.py deleted file mode 100644 index 8fa81eb..0000000 --- a/celery-rabbit-example/celery_config/app_celery.py +++ /dev/null @@ -1,25 +0,0 @@ -from celery import Celery -from pathlib import Path -from decouple import AutoConfig - -BASE_DIR = Path.cwd().parent -config = AutoConfig(search_path=BASE_DIR.joinpath('config')) - - -RABBITMQ_DEFAULT_USER = config('RABBITMQ_DEFAULT_USER') -RABBITMQ_DEFAULT_PASS = config('RABBITMQ_DEFAULT_PASS') -RABBITMQ_PORT = config('RABBITMQ_PORT', cast=int, default=5672) -RABBITMQ_HOST = config('RABBITMQ_HOST') - - -app_celery_instance = Celery( - 'tasks', - broker='amqp://{login}:{password}@{host}:{port}'.format( - login=RABBITMQ_DEFAULT_USER, - password=RABBITMQ_DEFAULT_PASS, - host=RABBITMQ_HOST, - port=RABBITMQ_PORT, - ), - # TODO: try to get async results with and without backend configured - backend='rpc://', -) diff --git a/celery-rabbit-example/config/.env b/celery-rabbit-example/config/.env deleted file mode 100644 index d2258a6..0000000 --- a/celery-rabbit-example/config/.env +++ /dev/null @@ -1,6 +0,0 @@ -# RabbitMQ settings: - -RABBITMQ_DEFAULT_USER=rabbit_admin -RABBITMQ_DEFAULT_PASS=mypass -RABBITMQ_PORT=5672 -RABBITMQ_HOST=rabbitmq_host diff --git a/celery-rabbit-example/docker-compose.yml b/celery-rabbit-example/docker-compose.yml deleted file mode 100644 index 7f75a24..0000000 --- a/celery-rabbit-example/docker-compose.yml +++ /dev/null @@ -1,28 +0,0 @@ -version: '3.7' - -services: - - rabbitmq: - hostname: rabbitmq_host - image: 'rabbitmq:3.8.18-management-alpine' - container_name: first_rabbit - env_file: config/.env - restart: unless-stopped - ports: - - 8080:15672 - - 5672:5672 - - worker: - container_name: first_celery - build: . - command: celery --app=my_app:app_celery_instance worker --loglevel=INFO - env_file: config/.env - depends_on: - - rabbitmq - restart: unless-stopped - -networks: - default: - name: celery_network - driver: bridge - diff --git a/celery-rabbit-example/my_app.py b/celery-rabbit-example/my_app.py deleted file mode 100644 index 99efd1f..0000000 --- a/celery-rabbit-example/my_app.py +++ /dev/null @@ -1,14 +0,0 @@ -from celery_config.app_celery import app_celery_instance - - -@app_celery_instance.task -def add(first: int, second: int) -> int: - print(first + second) - return first + second - - -# TODO: try with `@app.task(throws=(ZeroDivisionError,))` -@app_celery_instance.task -def div(first: int, second: int) -> float: - # TODO: show how errors work - return first / second diff --git a/celery-rabbit-example/requirements.txt b/celery-rabbit-example/requirements.txt deleted file mode 100644 index 34b6537..0000000 --- a/celery-rabbit-example/requirements.txt +++ /dev/null @@ -1,2 +0,0 @@ -celery==5.0.2 -python-decouple==3.3 diff --git a/github-stars/config/.env b/github-stars/config/.env index d0e5f8b..6c4c3d4 100644 --- a/github-stars/config/.env +++ b/github-stars/config/.env @@ -4,7 +4,7 @@ DOMAIN_NAME=localhost TLS_EMAIL=webmaster@localhost GITHUB_USERNAME= -GITHUB_PASSWORD= +GITHUB_TOKEN= # === Django === diff --git a/github-stars/docker-compose.yml b/github-stars/docker-compose.yml index 96d8dc0..484542e 100644 --- a/github-stars/docker-compose.yml +++ b/github-stars/docker-compose.yml @@ -13,7 +13,7 @@ services: - webnet env_file: ./config/.env ports: - - 5433:5432 + - "5433:5432" rabbitmq: hostname: rabbitmq_host @@ -24,8 +24,8 @@ services: networks: - webnet ports: - - 8080:15672 - - 5672:5672 + - "8080:15672" + - "5672:5672" web: image: "github-repos" @@ -45,7 +45,7 @@ services: volumes: - .:/code ports: - - 8000:8000 + - "8000:8000" depends_on: - db networks: @@ -93,7 +93,7 @@ services: - web restart: unless-stopped ports: - - 5555:5555 + - "5555:5555" networks: - webnet diff --git a/github-stars/docker/django/Dockerfile b/github-stars/docker/django/Dockerfile index b82b3cd..a04476a 100644 --- a/github-stars/docker/django/Dockerfile +++ b/github-stars/docker/django/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.8.9-slim-buster +FROM python:3.9.7-slim-buster ENV BUILD_ONLY_PACKAGES='wget' \ # python: @@ -11,7 +11,7 @@ ENV BUILD_ONLY_PACKAGES='wget' \ PIP_DISABLE_PIP_VERSION_CHECK=on \ PIP_DEFAULT_TIMEOUT=100 \ # poetry: - POETRY_VERSION=1.1.4 \ + POETRY_VERSION=1.1.11 \ POETRY_NO_INTERACTION=1 \ POETRY_VIRTUALENVS_CREATE=false \ POETRY_CACHE_DIR='/var/cache/pypoetry' \ diff --git a/github-stars/poetry.lock b/github-stars/poetry.lock index 24681a0..6a0cc7d 100644 --- a/github-stars/poetry.lock +++ b/github-stars/poetry.lock @@ -1,3 +1,22 @@ +[[package]] +name = "aiohttp" +version = "3.7.4.post0" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<5.0" +multidict = ">=4.5,<7.0" +typing-extensions = ">=3.6.5" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + [[package]] name = "alabaster" version = "0.7.12" @@ -52,6 +71,14 @@ category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +[[package]] +name = "async-timeout" +version = "3.0.1" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.5.3" + [[package]] name = "atomicwrites" version = "1.4.0" @@ -64,7 +91,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" name = "attrs" version = "21.2.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" @@ -248,13 +275,13 @@ pycparser = "*" name = "chardet" version = "4.0.0" description = "Universal encoding detector for Python 2 and 3" -category = "dev" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "charset-normalizer" -version = "2.0.2" +version = "2.0.6" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "dev" optional = false @@ -284,14 +311,14 @@ click = "*" [[package]] name = "click-didyoumean" -version = "0.0.3" -description = "Enable git-like did-you-mean feature in click." +version = "0.3.0" +description = "Enables git-like *did-you-mean* feature in click" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6.2,<4.0.0" [package.dependencies] -click = "*" +click = ">=7" [[package]] name = "click-plugins" @@ -330,7 +357,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "configupdater" -version = "2.0" +version = "3.0" description = "Parser like ConfigParser but for updating configuration files" category = "dev" optional = false @@ -352,14 +379,14 @@ cli = ["click"] [[package]] name = "coverage" -version = "5.5" +version = "6.0" description = "Code coverage measurement for Python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.6" [package.extras] -toml = ["toml"] +toml = ["tomli"] [[package]] name = "darglint" @@ -371,7 +398,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "decorator" -version = "5.0.9" +version = "5.1.0" description = "Decorators for Humans" category = "dev" optional = false @@ -391,21 +418,21 @@ polib = ">=1.0.8" [[package]] name = "dictdiffer" -version = "0.8.1" +version = "0.9.0" description = "Dictdiffer is a library that helps you to diff and patch dictionaries." category = "dev" optional = false python-versions = "*" [package.extras] -all = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)", "numpy (>=1.11.0)"] -docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"] -numpy = ["numpy (>=1.11.0)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)"] +all = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)", "check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "sphinx (>=3)", "tox (>=3.7.0)", "numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "pytest (==5.4.3)", "pytest-pycodestyle (>=2)", "pytest-pydocstyle (>=2)", "pytest (>=6)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)", "numpy (>=1.20.0)"] +docs = ["Sphinx (>=3)", "sphinx-rtd-theme (>=0.2)"] +numpy = ["numpy (>=1.13.0)", "numpy (>=1.15.0)", "numpy (>=1.18.0)", "numpy (>=1.20.0)"] +tests = ["check-manifest (>=0.42)", "mock (>=1.3.0)", "pytest-cov (>=2.10.1)", "pytest-isort (>=1.2.0)", "sphinx (>=3)", "tox (>=3.7.0)", "pytest (==5.4.3)", "pytest-pycodestyle (>=2)", "pytest-pydocstyle (>=2)", "pytest (>=6)", "pytest-pycodestyle (>=2.2.0)", "pytest-pydocstyle (>=2.2.0)"] [[package]] name = "django" -version = "3.2.5" +version = "3.2.8" description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." category = "main" optional = false @@ -422,7 +449,7 @@ bcrypt = ["bcrypt"] [[package]] name = "django-axes" -version = "5.20.0" +version = "5.25.0" description = "Keep track of failed login attempts in Django-powered sites." category = "main" optional = false @@ -430,7 +457,7 @@ python-versions = "~=3.6" [package.dependencies] django = ">=2.2" -django-ipware = ">=3,<4" +django-ipware = ">=3,<5" [[package]] name = "django-coverage-plugin" @@ -461,7 +488,7 @@ tests = ["pytest (<4.0)", "pytest-django", "pytest-flakes (==1.0.1)", "pytest-pe [[package]] name = "django-debug-toolbar" -version = "3.2.1" +version = "3.2.2" description = "A configurable set of panels that display various debug information about the current request/response." category = "dev" optional = false @@ -506,15 +533,15 @@ Django = ">=1.11" [[package]] name = "django-ipware" -version = "3.0.2" -description = "A Django utility application that returns client's real IP address" +version = "4.0.0" +description = "A Django application to retrieve user's IP address" category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [[package]] name = "django-migration-linter" -version = "3.0.0" +version = "3.0.1" description = "Detect backward incompatible migrations for your django project" category = "dev" optional = false @@ -531,7 +558,7 @@ test = ["tox (>=3.15.2)", "mysqlclient (>=1.4.6)", "psycopg2-binary (>=2.8.5,<2. [[package]] name = "django-permissions-policy" -version = "4.1.0" +version = "4.4.0" description = "Set the draft security HTTP header Permissions-Policy (previously Feature-Policy) on your Django app." category = "main" optional = false @@ -562,7 +589,7 @@ Django = ">=2.2,<3.0.0 || >=3.1.0" [[package]] name = "django-split-settings" -version = "1.0.1" +version = "1.1.0" description = "Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files." category = "main" optional = false @@ -722,7 +749,7 @@ flake8 = ">=3.5,<4.0" [[package]] name = "flake8-bugbear" -version = "21.4.3" +version = "21.9.2" description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." category = "dev" optional = false @@ -748,7 +775,7 @@ flake8 = ">=2,<4.0.0" [[package]] name = "flake8-comprehensions" -version = "3.5.0" +version = "3.6.1" description = "A flake8 plugin to help you write better list/set/dict comprehensions." category = "dev" optional = false @@ -862,7 +889,7 @@ flake8-plugin-utils = ">=1.3.2,<2.0.0" [[package]] name = "flake8-quotes" -version = "3.2.0" +version = "3.3.0" description = "Flake8 lint for quotes." category = "dev" optional = false @@ -923,14 +950,15 @@ smmap = ">=3.0.1,<5" [[package]] name = "gitpython" -version = "3.1.18" -description = "Python Git Library" +version = "3.1.24" +description = "GitPython is a python library used to interact with Git repositories" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.dependencies] gitdb = ">=4.0.1,<5" +typing-extensions = {version = ">=3.7.4.3", markers = "python_version < \"3.10\""} [[package]] name = "gunicorn" @@ -948,7 +976,7 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "humanize" -version = "3.10.0" +version = "3.11.0" description = "Python humanize utilities" category = "main" optional = false @@ -959,7 +987,7 @@ tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "hypothesis" -version = "6.14.2" +version = "6.23.1" description = "A library for property-based testing" category = "dev" optional = false @@ -987,7 +1015,7 @@ zoneinfo = ["importlib-resources (>=3.3.0)", "backports.zoneinfo (>=0.2.1)", "tz [[package]] name = "identify" -version = "2.2.11" +version = "2.3.0" description = "File identification library for Python" category = "dev" optional = false @@ -1000,7 +1028,7 @@ license = ["editdistance-s"] name = "idna" version = "3.2" description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" +category = "main" optional = false python-versions = ">=3.5" @@ -1014,7 +1042,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "importlib-metadata" -version = "4.6.1" +version = "4.8.1" description = "Read metadata from Python packages" category = "dev" optional = false @@ -1038,7 +1066,7 @@ python-versions = "*" [[package]] name = "ipython" -version = "7.25.0" +version = "7.28.0" description = "IPython: Productive Interactive Computing" category = "dev" optional = false @@ -1068,17 +1096,9 @@ parallel = ["ipyparallel"] qtconsole = ["qtconsole"] test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "dev" -optional = false -python-versions = "*" - [[package]] name = "isort" -version = "5.9.2" +version = "5.9.3" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -1107,7 +1127,7 @@ testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] [[package]] name = "jinja2" -version = "3.0.1" +version = "3.0.2" description = "A very fast and expressive template engine." category = "dev" optional = false @@ -1180,7 +1200,7 @@ python-versions = ">=3.6" [[package]] name = "marshmallow" -version = "3.12.2" +version = "3.13.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." category = "dev" optional = false @@ -1188,7 +1208,7 @@ python-versions = ">=3.5" [package.extras] dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)", "tox"] -docs = ["sphinx (==4.0.3)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.6)"] +docs = ["sphinx (==4.1.1)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.6)"] lint = ["mypy (==0.910)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)"] tests = ["pytest", "pytz", "simplejson"] @@ -1205,7 +1225,7 @@ marshmallow = ">=3.0.0b10" [[package]] name = "matplotlib-inline" -version = "0.1.2" +version = "0.1.3" description = "Inline Matplotlib backend for Jupyter" category = "dev" optional = false @@ -1224,12 +1244,20 @@ python-versions = "*" [[package]] name = "more-itertools" -version = "8.8.0" +version = "8.10.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false python-versions = ">=3.5" +[[package]] +name = "multidict" +version = "5.2.0" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "mypy" version = "0.910" @@ -1328,11 +1356,11 @@ testing = ["docopt", "pytest (<6.0.0)"] [[package]] name = "pathspec" -version = "0.8.1" +version = "0.9.0" description = "Utility library for gitignore style pattern matching of file paths." category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" [[package]] name = "pbr" @@ -1374,14 +1402,15 @@ python-versions = "*" [[package]] name = "pluggy" -version = "0.13.1" +version = "1.0.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "ply" @@ -1428,11 +1457,11 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.19" +version = "3.0.20" description = "Library for building powerful interactive command lines in Python" category = "main" optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.6.2" [package.dependencies] wcwidth = "*" @@ -1516,7 +1545,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.9.0" +version = "2.10.0" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false @@ -1532,7 +1561,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "pytest" -version = "6.2.4" +version = "6.2.5" description = "pytest: simple powerful testing with Python" category = "dev" optional = false @@ -1544,7 +1573,7 @@ attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<1.0.0a1" +pluggy = ">=0.12,<2.0" py = ">=1.8.2" toml = "*" @@ -1595,7 +1624,7 @@ testing = ["django", "django-configurations (>=2.0)"] [[package]] name = "pytest-randomly" -version = "3.8.0" +version = "3.10.1" description = "Pytest plugin to randomly order tests and control random.seed." category = "dev" optional = false @@ -1607,14 +1636,14 @@ pytest = "*" [[package]] name = "pytest-testmon" -version = "1.1.1" +version = "1.2.0" description = "selects tests affected by changed files and methods" category = "dev" optional = false python-versions = ">=3.6" [package.dependencies] -coverage = ">=4,<6" +coverage = ">=4,<7" pytest = ">=5,<7" [[package]] @@ -1630,7 +1659,7 @@ pytest = ">=3.6.0" [[package]] name = "python-decouple" -version = "3.4" +version = "3.5" description = "Strict separation of settings from code." category = "main" optional = false @@ -1652,7 +1681,7 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" -version = "2021.1" +version = "2021.3" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -1697,7 +1726,7 @@ docutils = ">=0.11,<1.0" [[package]] name = "ruamel.yaml" -version = "0.17.10" +version = "0.17.16" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" category = "dev" optional = false @@ -1766,7 +1795,7 @@ python-versions = "*" [[package]] name = "sphinx" -version = "4.1.1" +version = "4.2.0" description = "Python documentation generator" category = "dev" optional = false @@ -1883,7 +1912,7 @@ test = ["pytest"] [[package]] name = "sqlparse" -version = "0.4.1" +version = "0.4.2" description = "A non-validating SQL parser." category = "main" optional = false @@ -1891,7 +1920,7 @@ python-versions = ">=3.5" [[package]] name = "stevedore" -version = "3.3.0" +version = "3.4.0" description = "Manage dynamic plugins for Python applications" category = "dev" optional = false @@ -1915,7 +1944,7 @@ tests = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest-asyncio", "pytest [[package]] name = "testfixtures" -version = "6.18.0" +version = "6.18.3" description = "A collection of helpers and mock objects for unit tests and doc tests." category = "dev" optional = false @@ -1960,29 +1989,26 @@ python-versions = ">= 3.5" [[package]] name = "traitlets" -version = "5.0.5" +version = "5.1.0" description = "Traitlets Python configuration system" category = "dev" optional = false python-versions = ">=3.7" -[package.dependencies] -ipython-genutils = "*" - [package.extras] test = ["pytest"] [[package]] name = "typing-extensions" -version = "3.10.0.0" +version = "3.10.0.2" description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" +category = "main" optional = false python-versions = "*" [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.7" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "dev" optional = false @@ -2051,19 +2077,31 @@ dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] [[package]] name = "yamllint" -version = "1.26.1" +version = "1.26.3" description = "A linter for YAML files." category = "dev" optional = false -python-versions = ">=3.5.*" +python-versions = ">=3.5" [package.dependencies] pathspec = ">=0.5.3" pyyaml = "*" +[[package]] +name = "yarl" +version = "1.6.3" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + [[package]] name = "zipp" -version = "3.5.0" +version = "3.6.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false @@ -2075,10 +2113,49 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [metadata] lock-version = "1.1" -python-versions = "3.8.9" -content-hash = "16edd0bd4369275d0ebd7789c6cf7c559ccb5ea10540c254fe3131f36a719fa5" +python-versions = "3.9.7" +content-hash = "a0724c3cf3de52d359b5cdfbc2fc2c00579423febd38ec177b1e7d124577f7ce" [metadata.files] +aiohttp = [ + {file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"}, + {file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"}, + {file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"}, + {file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"}, + {file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"}, + {file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"}, +] alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, @@ -2103,6 +2180,10 @@ astor = [ {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, ] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] atomicwrites = [ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, @@ -2212,8 +2293,8 @@ chardet = [ {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.2.tar.gz", hash = "sha256:951567c2f7433a70ab63f1be67e5ee05d3925d9423306ecb71a3b272757bcc95"}, - {file = "charset_normalizer-2.0.2-py3-none-any.whl", hash = "sha256:3c502a35807c9df35697b0f44b1d65008f83071ff29c69677c7c22573bc5a45a"}, + {file = "charset-normalizer-2.0.6.tar.gz", hash = "sha256:5ec46d183433dcbd0ab716f2d7f29d8dee50505b3fdb40c6b985c7c4f5a3591f"}, + {file = "charset_normalizer-2.0.6-py3-none-any.whl", hash = "sha256:5d209c0a931f215cee683b6445e2d77677e7e75e159f78def0db09d68fafcaa6"}, ] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, @@ -2223,7 +2304,8 @@ click-default-group = [ {file = "click-default-group-1.2.2.tar.gz", hash = "sha256:d9560e8e8dfa44b3562fbc9425042a0fd6d21956fcc2db0077f63f34253ab904"}, ] click-didyoumean = [ - {file = "click-didyoumean-0.0.3.tar.gz", hash = "sha256:112229485c9704ff51362fe34b2d4f0b12fc71cc20f6d2b3afabed4b8bfa6aeb"}, + {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, + {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, ] click-plugins = [ {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, @@ -2238,90 +2320,73 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] configupdater = [ - {file = "ConfigUpdater-2.0-py2.py3-none-any.whl", hash = "sha256:bc62bd5141c45a89840a3e82e0a06f23fb2c00de82e2b72c8030cafb4daea9a2"}, - {file = "ConfigUpdater-2.0.tar.gz", hash = "sha256:6a60447fb25e5cb5036cdd5761287ac5649135a49094bc8bd71d999417483441"}, + {file = "ConfigUpdater-3.0-py2.py3-none-any.whl", hash = "sha256:b9bd8179995b7810fc41b04dc541d00e75dbae6398209d319f599bd4ac080d55"}, + {file = "ConfigUpdater-3.0.tar.gz", hash = "sha256:430d3da24b7905a780cbd170765c09f16a74bb175d07e6a7eff2d621914bbc91"}, ] confusable-homoglyphs = [ {file = "confusable_homoglyphs-3.2.0-py2.py3-none-any.whl", hash = "sha256:e3ce611028d882b74a5faa69e3cbb5bd4dcd9f69936da6e73d33eda42c917944"}, {file = "confusable_homoglyphs-3.2.0.tar.gz", hash = "sha256:3b4a0d9fa510669498820c91a0bfc0c327568cecec90648cf3819d4a6fc6a751"}, ] coverage = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, + {file = "coverage-6.0-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:3dfb23cc180b674a11a559183dff9655beb9da03088f3fe3c4f3a6d200c86f05"}, + {file = "coverage-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5dd5ae0a9cd55d71f1335c331e9625382239b8cede818fb62d8d2702336dbf8"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8426fec5ad5a6e8217921716b504e9b6e1166dc147e8443b4855e329db686282"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:aa5d4d43fa18cc9d0c6e02a83de0b9729b5451a9066574bd276481474f0a53ab"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78dd3eeb8f5ff26d2113c41836bac04a9ea91be54c346826b54a373133c8c53"}, + {file = "coverage-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:581fddd2f883379bd5af51da9233e0396b6519f3d3eeae4fb88867473be6d56e"}, + {file = "coverage-6.0-cp310-cp310-win32.whl", hash = "sha256:43bada49697a62ffa0283c7f01bbc76aac562c37d4bb6c45d56dd008d841194e"}, + {file = "coverage-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:fa816e97cfe1f691423078dffa39a18106c176f28008db017b3ce3e947c34aa5"}, + {file = "coverage-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5c191e01b23e760338f19d8ba2470c0dad44c8b45e41ac043b2db84efc62f695"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274a612f67f931307706b60700f1e4cf80e1d79dff6c282fc9301e4565e78724"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9dbfcbc56d8de5580483cf2caff6a59c64d3e88836cbe5fb5c20c05c29a8808"}, + {file = "coverage-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e63490e8a6675cee7a71393ee074586f7eeaf0e9341afd006c5d6f7eec7c16d7"}, + {file = "coverage-6.0-cp36-cp36m-win32.whl", hash = "sha256:72f8c99f1527c5a8ee77c890ea810e26b39fd0b4c2dffc062e20a05b2cca60ef"}, + {file = "coverage-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:88f1810eb942e7063d051d87aaaa113eb5fd5a7fd2cda03a972de57695b8bb1a"}, + {file = "coverage-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:befb5ffa9faabef6dadc42622c73de168001425258f0b7e402a2934574e7a04b"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7dbda34e8e26bd86606ba8a9c13ccb114802e01758a3d0a75652ffc59a573220"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b4ee5815c776dfa3958ba71c7cd4cdd8eb40d79358a18352feb19562fe4408c4"}, + {file = "coverage-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d82cbef1220703ce56822be7fbddb40736fc1a928ac893472df8aff7421ae0aa"}, + {file = "coverage-6.0-cp37-cp37m-win32.whl", hash = "sha256:d795a2c92fe8cb31f6e9cd627ee4f39b64eb66bf47d89d8fcf7cb3d17031c887"}, + {file = "coverage-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6e216e4021c934246c308fd3e0d739d9fa8a3f4ea414f584ab90ef9c1592f282"}, + {file = "coverage-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8305e14112efb74d0b5fec4df6e41cafde615c2392a7e51c84013cafe945842c"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4865dc4a7a566147cbdc2b2f033a6cccc99a7dcc89995137765c384f6c73110b"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:25df2bc53a954ba2ccf230fa274d1de341f6aa633d857d75e5731365f7181749"}, + {file = "coverage-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:08fd55d2e00dac4c18a2fa26281076035ec86e764acdc198b9185ce749ada58f"}, + {file = "coverage-6.0-cp38-cp38-win32.whl", hash = "sha256:11ce082eb0f7c2bbfe96f6c8bcc3a339daac57de4dc0f3186069ec5c58da911c"}, + {file = "coverage-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:7844a8c6a0fee401edbf578713c2473e020759267c40261b294036f9d3eb6a2d"}, + {file = "coverage-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bea681309bdd88dd1283a8ba834632c43da376d9bce05820826090aad80c0126"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e735ab8547d8a1fe8e58dd765d6f27ac539b395f52160d767b7189f379f9be7a"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7593a49300489d064ebb6c58539f52cbbc4a2e6a4385de5e92cae1563f88a425"}, + {file = "coverage-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adb0f4c3c8ba8104378518a1954cbf3d891a22c13fd0e0bf135391835f44f288"}, + {file = "coverage-6.0-cp39-cp39-win32.whl", hash = "sha256:8da0c4a26a831b392deaba5fdd0cd7838d173b47ce2ec3d0f37be630cb09ef6e"}, + {file = "coverage-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:7af2f8e7bb54ace984de790e897f858e88068d8fbc46c9490b7c19c59cf51822"}, + {file = "coverage-6.0-pp36-none-any.whl", hash = "sha256:82b58d37c47d93a171be9b5744bcc96a0012cbf53d5622b29a49e6be2097edd7"}, + {file = "coverage-6.0-pp37-none-any.whl", hash = "sha256:fff04bfefb879edcf616f1ce5ea6f4a693b5976bdc5e163f8464f349c25b59f0"}, + {file = "coverage-6.0.tar.gz", hash = "sha256:17983f6ccc47f4864fd16d20ff677782b23d1207bf222d10e4d676e4636b0872"}, ] darglint = [ {file = "darglint-1.8.0-py3-none-any.whl", hash = "sha256:ac6797bcc918cd8d8f14c168a4a364f54e1aeb4ced59db58e7e4c6dfec2fe15c"}, {file = "darglint-1.8.0.tar.gz", hash = "sha256:aa605ef47817a6d14797d32b390466edab621768ea4ca5cc0f3c54f6d8dcaec8"}, ] decorator = [ - {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, - {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, + {file = "decorator-5.1.0-py3-none-any.whl", hash = "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374"}, + {file = "decorator-5.1.0.tar.gz", hash = "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7"}, ] dennis = [ {file = "dennis-0.9-py2.py3-none-any.whl", hash = "sha256:f6487392ac91800c5f0684a99b404b7fd0f72ceb48faeb5a0ce4e2c24fb62d3f"}, {file = "dennis-0.9.tar.gz", hash = "sha256:8c942dd5da7d03c65daebc069c5ee5c7f1374ac9b0c8c89c627caa66fe822604"}, ] dictdiffer = [ - {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"}, - {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"}, + {file = "dictdiffer-0.9.0-py2.py3-none-any.whl", hash = "sha256:442bfc693cfcadaf46674575d2eba1c53b42f5e404218ca2c2ff549f2df56595"}, + {file = "dictdiffer-0.9.0.tar.gz", hash = "sha256:17bacf5fbfe613ccf1b6d512bd766e6b21fb798822a133aa86098b8ac9997578"}, ] django = [ - {file = "Django-3.2.5-py3-none-any.whl", hash = "sha256:c58b5f19c5ae0afe6d75cbdd7df561e6eb929339985dbbda2565e1cabb19a62e"}, - {file = "Django-3.2.5.tar.gz", hash = "sha256:3da05fea54fdec2315b54a563d5b59f3b4e2b1e69c3a5841dda35019c01855cd"}, + {file = "Django-3.2.8-py3-none-any.whl", hash = "sha256:42573831292029639b798fe4d3812996bfe4ff3275f04566da90764daec011a5"}, + {file = "Django-3.2.8.tar.gz", hash = "sha256:f6d2c4069c9b9bfac03bedff927ea1f9e0d29e34525cec8a68fd28eb2a8df7af"}, ] django-axes = [ - {file = "django-axes-5.20.0.tar.gz", hash = "sha256:fe2c36a2252e1936e901d87bf49249aa8ac33655dd47c4083ba5ff56512cc247"}, - {file = "django_axes-5.20.0-py3-none-any.whl", hash = "sha256:7128589d9002216f5131be2581c4ef9c2039d59624406e2dcad2624bff850304"}, + {file = "django-axes-5.25.0.tar.gz", hash = "sha256:835327df91e039c3eb7479441b7b3cbcc5aecc25025753c5ae00969309b23dd6"}, + {file = "django_axes-5.25.0-py3-none-any.whl", hash = "sha256:c72e19981aae1426dc356b9e69a6e168b3e7e91ff305beec9a375a232f579724"}, ] django-coverage-plugin = [ {file = "django_coverage_plugin-2.0.0.tar.gz", hash = "sha256:5a7ac412528876563a45f9b54ad9962e33e5f95b409843c4c6c92cb0247eee66"}, @@ -2331,8 +2396,8 @@ django-csp = [ {file = "django_csp-3.7.tar.gz", hash = "sha256:01eda02ad3f10261c74131cdc0b5a6a62b7c7ad4fd017fbefb7a14776e0a9727"}, ] django-debug-toolbar = [ - {file = "django-debug-toolbar-3.2.1.tar.gz", hash = "sha256:a5ff2a54f24bf88286f9872836081078f4baa843dc3735ee88524e89f8821e33"}, - {file = "django_debug_toolbar-3.2.1-py3-none-any.whl", hash = "sha256:e759e63e3fe2d3110e0e519639c166816368701eab4a47fed75d7de7018467b9"}, + {file = "django-debug-toolbar-3.2.2.tar.gz", hash = "sha256:8c5b13795d4040008ee69ba82dcdd259c49db346cf7d0de6e561a49d191f0860"}, + {file = "django_debug_toolbar-3.2.2-py3-none-any.whl", hash = "sha256:d7bab7573fab35b0fd029163371b7182f5826c13da69734beb675c761d06a4d3"}, ] django-extra-checks = [ {file = "django-extra-checks-0.11.0.tar.gz", hash = "sha256:61681433f2df8b8932676c216472b7f5554bda0018058d0a0bac89bf377347bd"}, @@ -2347,15 +2412,16 @@ django-http-referrer-policy = [ {file = "django_http_referrer_policy-1.1.1-py2.py3-none-any.whl", hash = "sha256:7617d1256f1ab80c1a12bffdd8c8d24b94093eb1e21d035e2aa6d7d3c5ac999e"}, ] django-ipware = [ - {file = "django-ipware-3.0.2.tar.gz", hash = "sha256:c7df8e1410a8e5d6b1fbae58728402ea59950f043c3582e033e866f0f0cf5e94"}, + {file = "django-ipware-4.0.0.tar.gz", hash = "sha256:1294f916f3b3475e40e1b0ec1bd320aa2397978eae672721c81cbc2ed517e9ee"}, + {file = "django_ipware-4.0.0-py2.py3-none-any.whl", hash = "sha256:116bd0d7940f09bf7ffd465943992e23d87e772a9d6c0d3a57b74040589a383b"}, ] django-migration-linter = [ - {file = "django-migration-linter-3.0.0.tar.gz", hash = "sha256:a45d955bbd01fff57d19978cd7e99599e7592fb94c27032edfd026ef51e45a05"}, - {file = "django_migration_linter-3.0.0-py2.py3-none-any.whl", hash = "sha256:beb62cf9777b6e3a9d902726fd5e514f73edae3398e1e948c5497c34315c87ad"}, + {file = "django-migration-linter-3.0.1.tar.gz", hash = "sha256:24efbfde19f65bf67cf3413400f5e06781d27c42ed144b029df3a235f6137529"}, + {file = "django_migration_linter-3.0.1-py2.py3-none-any.whl", hash = "sha256:3b176165003f0b81fe29d430e85904ca823f45203eaac8eeb567c061e818b7a2"}, ] django-permissions-policy = [ - {file = "django-permissions-policy-4.1.0.tar.gz", hash = "sha256:30df0dfe6579f60743d181378c7cbbb44526a5df469aa633251234387d3819f1"}, - {file = "django_permissions_policy-4.1.0-py3-none-any.whl", hash = "sha256:774ca81646c84793c8c5645e581ecd4d08a88d492cf90c8983648d8fddcbb3c8"}, + {file = "django-permissions-policy-4.4.0.tar.gz", hash = "sha256:16f51e9ae58907ef27f4b77779b766fa03700d3bea286d5c4cc51a94b4bf6748"}, + {file = "django_permissions_policy-4.4.0-py3-none-any.whl", hash = "sha256:8be245438ad6a22ec85f026ed260950840e902b8626fa2602de8963b678e81f5"}, ] django-querycount = [ {file = "django-querycount-0.7.0.tar.gz", hash = "sha256:8f5123d78716ff0704f2373e746a7200b8d8417798ce4a99bf2de87e3768f9ce"}, @@ -2365,8 +2431,8 @@ django-registration = [ {file = "django_registration-3.2-py3-none-any.whl", hash = "sha256:e79fdbfa22bfaf4182efccb6604391391a7de19438d2669c5b9520a7708efbd2"}, ] django-split-settings = [ - {file = "django-split-settings-1.0.1.tar.gz", hash = "sha256:2da16cd967cd38315ec7ff0ae0c9db8488f8528bb2e5de26cd898328dc4bbeac"}, - {file = "django_split_settings-1.0.1-py3-none-any.whl", hash = "sha256:8d636649023289d0ef0ba08b0a4f37761adc94a29ee0ebfe65922c3cb0594ede"}, + {file = "django-split-settings-1.1.0.tar.gz", hash = "sha256:6b3aed89667a95525152026eab93a9f038ff22df6883006318b8b4a3d0ca6888"}, + {file = "django_split_settings-1.1.0-py3-none-any.whl", hash = "sha256:5d97ae64cf9ed14a831722d82ac725944667ac8c08307b7cfd22e91367b411d0"}, ] django-stubs = [ {file = "django-stubs-1.8.0.tar.gz", hash = "sha256:717967d7fee0a6af0746724a0be80d72831a982a40fa8f245a6a46f4cafd157b"}, @@ -2418,16 +2484,16 @@ flake8-broken-line = [ {file = "flake8_broken_line-0.3.0-py3-none-any.whl", hash = "sha256:611f79c7f27118e7e5d3dc098ef7681c40aeadf23783700c5dbee840d2baf3af"}, ] flake8-bugbear = [ - {file = "flake8-bugbear-21.4.3.tar.gz", hash = "sha256:2346c81f889955b39e4a368eb7d508de723d9de05716c287dc860a4073dc57e7"}, - {file = "flake8_bugbear-21.4.3-py36.py37.py38-none-any.whl", hash = "sha256:4f305dca96be62bf732a218fe6f1825472a621d3452c5b994d8f89dae21dbafa"}, + {file = "flake8-bugbear-21.9.2.tar.gz", hash = "sha256:db9a09893a6c649a197f5350755100bb1dd84f110e60cf532fdfa07e41808ab2"}, + {file = "flake8_bugbear-21.9.2-py36.py37.py38-none-any.whl", hash = "sha256:4f7eaa6f05b7d7ea4cbbde93f7bcdc5438e79320fa1ec420d860c181af38b769"}, ] flake8-commas = [ {file = "flake8-commas-2.0.0.tar.gz", hash = "sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7"}, {file = "flake8_commas-2.0.0-py2.py3-none-any.whl", hash = "sha256:ee2141a3495ef9789a3894ed8802d03eff1eaaf98ce6d8653a7c573ef101935e"}, ] flake8-comprehensions = [ - {file = "flake8-comprehensions-3.5.0.tar.gz", hash = "sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"}, - {file = "flake8_comprehensions-3.5.0-py3-none-any.whl", hash = "sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7"}, + {file = "flake8-comprehensions-3.6.1.tar.gz", hash = "sha256:4888de89248b7f7535159189ff693c77f8354f6d37a02619fa28c9921a913aa0"}, + {file = "flake8_comprehensions-3.6.1-py3-none-any.whl", hash = "sha256:e9a010b99aa90c05790d45281ad9953df44a4a08a1a8f6cd41f98b4fc6a268a0"}, ] flake8-debugger = [ {file = "flake8-debugger-4.0.0.tar.gz", hash = "sha256:e43dc777f7db1481db473210101ec2df2bd39a45b149d7218a618e954177eda6"}, @@ -2465,7 +2531,7 @@ flake8-pytest-style = [ {file = "flake8_pytest_style-1.5.0-py3-none-any.whl", hash = "sha256:ec287a7dc4fe95082af5e408c8b2f8f4b6bcb366d5a17ff6c34112eb03446580"}, ] flake8-quotes = [ - {file = "flake8-quotes-3.2.0.tar.gz", hash = "sha256:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"}, + {file = "flake8-quotes-3.3.0.tar.gz", hash = "sha256:f1dd87830ed77ff2ce47fc0ee0fd87ae20e8f045355354ffbf4dcaa18d528217"}, ] flake8-rst-docstrings = [ {file = "flake8-rst-docstrings-0.2.3.tar.gz", hash = "sha256:3045794e1c8467fba33aaea5c246b8369efc9c44ef8b0b20199bb6df7a4bd47b"}, @@ -2484,24 +2550,24 @@ gitdb = [ {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, ] gitpython = [ - {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, - {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, + {file = "GitPython-3.1.24-py3-none-any.whl", hash = "sha256:dc0a7f2f697657acc8d7f89033e8b1ea94dd90356b2983bca89dc8d2ab3cc647"}, + {file = "GitPython-3.1.24.tar.gz", hash = "sha256:df83fdf5e684fef7c6ee2c02fc68a5ceb7e7e759d08b694088d0cacb4eba59e5"}, ] gunicorn = [ {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, ] humanize = [ - {file = "humanize-3.10.0-py3-none-any.whl", hash = "sha256:aab7625d62dd5e0a054c8413a47d1fa257f3bdd8e9a2442c2fe36061bdd1d9bf"}, - {file = "humanize-3.10.0.tar.gz", hash = "sha256:b2413730ce6684f85e0439a5b80b8f402e09f03e16ab8023d1da758c6ff41148"}, + {file = "humanize-3.11.0-py3-none-any.whl", hash = "sha256:06c79af7873473c47477840010ccb9b11b0d431f37f4a81b71edd653211936be"}, + {file = "humanize-3.11.0.tar.gz", hash = "sha256:4160cdc63fcd0daac27d2e1e218a31bb396fc3fe5712d153675d89432a03778f"}, ] hypothesis = [ - {file = "hypothesis-6.14.2-py3-none-any.whl", hash = "sha256:e226139ede20a3023e2e8dbbfc8e46bfb5a83cb278acf9e6f23823b4c41e2a62"}, - {file = "hypothesis-6.14.2.tar.gz", hash = "sha256:93d9bbf4e5277e7a5f47857916cf8cde78b91bf8a819a61b6121e8bbcf219577"}, + {file = "hypothesis-6.23.1-py3-none-any.whl", hash = "sha256:e1c5c4a7e1f9a1a1da03cf6a148703333c468fb036f3cd785da1210c23648a4f"}, + {file = "hypothesis-6.23.1.tar.gz", hash = "sha256:23a1b0488aec5719e2f9e399342e10f30d497cbb9fd39470ef0975c1b502ae35"}, ] identify = [ - {file = "identify-2.2.11-py2.py3-none-any.whl", hash = "sha256:7abaecbb414e385752e8ce02d8c494f4fbc780c975074b46172598a28f1ab839"}, - {file = "identify-2.2.11.tar.gz", hash = "sha256:a0e700637abcbd1caae58e0463861250095dfe330a8371733a471af706a4a29a"}, + {file = "identify-2.3.0-py2.py3-none-any.whl", hash = "sha256:d1e82c83d063571bb88087676f81261a4eae913c492dafde184067c584bc7c05"}, + {file = "identify-2.3.0.tar.gz", hash = "sha256:fd08c97f23ceee72784081f1ce5125c8f53a02d3f2716dde79a6ab8f1039fea5"}, ] idna = [ {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, @@ -2512,32 +2578,28 @@ imagesize = [ {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, ] iniconfig = [ {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, ] ipython = [ - {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"}, - {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, + {file = "ipython-7.28.0-py3-none-any.whl", hash = "sha256:f16148f9163e1e526f1008d7c8d966d9c15600ca20d1a754287cf96d00ba6f1d"}, + {file = "ipython-7.28.0.tar.gz", hash = "sha256:2097be5c814d1b974aea57673176a924c4c8c9583890e7a5f082f547b9975b11"}, ] isort = [ - {file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"}, - {file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"}, + {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, + {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, ] jedi = [ {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, ] jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, + {file = "Jinja2-3.0.2-py3-none-any.whl", hash = "sha256:8569982d3f0889eed11dd620c706d39b60c36d6d25843961f33f77fb6bc6b20c"}, + {file = "Jinja2-3.0.2.tar.gz", hash = "sha256:827a0e32839ab1600d4eb1c4c33ec5a8edfbc5cb42dafa13b81f182f97784b45"}, ] jmespath = [ {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, @@ -2588,24 +2650,98 @@ markupsafe = [ {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] marshmallow = [ - {file = "marshmallow-3.12.2-py2.py3-none-any.whl", hash = "sha256:d4090ca9a36cd129126ad8b10c3982c47d4644a6e3ccb20534b512badce95f35"}, - {file = "marshmallow-3.12.2.tar.gz", hash = "sha256:77368dfedad93c3a041cbbdbce0b33fac1d8608c9e2e2288408a43ce3493d2ff"}, + {file = "marshmallow-3.13.0-py2.py3-none-any.whl", hash = "sha256:dd4724335d3c2b870b641ffe4a2f8728a1380cd2e7e2312756715ffeaa82b842"}, + {file = "marshmallow-3.13.0.tar.gz", hash = "sha256:c67929438fd73a2be92128caa0325b1b5ed8b626d91a094d2f7f2771bf1f1c0e"}, ] marshmallow-polyfield = [ {file = "marshmallow-polyfield-5.10.tar.gz", hash = "sha256:75d0e31b725650e91428f975a66ed30f703cc6f9fcfe45b8436ee6d676921691"}, {file = "marshmallow_polyfield-5.10-py3-none-any.whl", hash = "sha256:a0a91730c6d21bfac1563990c7ba1413928e7499af669619d4fb38d1fb25c4e9"}, ] matplotlib-inline = [ - {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, - {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, + {file = "matplotlib-inline-0.1.3.tar.gz", hash = "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee"}, + {file = "matplotlib_inline-0.1.3-py3-none-any.whl", hash = "sha256:aed605ba3b72462d64d475a21a9296f400a19c4f74a31b59103d2a99ffd5aa5c"}, ] mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] more-itertools = [ - {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, - {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, + {file = "more-itertools-8.10.0.tar.gz", hash = "sha256:1debcabeb1df793814859d64a81ad7cb10504c24349368ccf214c664c474f41f"}, + {file = "more_itertools-8.10.0-py3-none-any.whl", hash = "sha256:56ddac45541718ba332db05f464bebfb0768110111affd27f66e0051f276fa43"}, +] +multidict = [ + {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55"}, + {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e"}, + {file = "multidict-5.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7"}, + {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf"}, + {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b"}, + {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5"}, + {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f"}, + {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747"}, + {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52"}, + {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628"}, + {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda"}, + {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a"}, + {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86"}, + {file = "multidict-5.2.0-cp310-cp310-win32.whl", hash = "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7"}, + {file = "multidict-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f"}, + {file = "multidict-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d"}, + {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37"}, + {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b"}, + {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1"}, + {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4"}, + {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02"}, + {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5"}, + {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858"}, + {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677"}, + {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded"}, + {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d"}, + {file = "multidict-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9"}, + {file = "multidict-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0"}, + {file = "multidict-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0"}, + {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11"}, + {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422"}, + {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3"}, + {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d"}, + {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac"}, + {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0"}, + {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704"}, + {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23"}, + {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d"}, + {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b"}, + {file = "multidict-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef"}, + {file = "multidict-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a"}, + {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8"}, + {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6"}, + {file = "multidict-5.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065"}, + {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e"}, + {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c"}, + {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64"}, + {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031"}, + {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d"}, + {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01"}, + {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4"}, + {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b"}, + {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac"}, + {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22"}, + {file = "multidict-5.2.0-cp38-cp38-win32.whl", hash = "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940"}, + {file = "multidict-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0"}, + {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24"}, + {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21"}, + {file = "multidict-5.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae"}, + {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6"}, + {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c"}, + {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0"}, + {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17"}, + {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0"}, + {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1"}, + {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621"}, + {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341"}, + {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b"}, + {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5"}, + {file = "multidict-5.2.0-cp39-cp39-win32.whl", hash = "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8"}, + {file = "multidict-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac"}, + {file = "multidict-5.2.0.tar.gz", hash = "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce"}, ] mypy = [ {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, @@ -2653,8 +2789,8 @@ parso = [ {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, ] pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, ] pbr = [ {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"}, @@ -2673,8 +2809,8 @@ pickleshare = [ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ] pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] ply = [ {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, @@ -2692,8 +2828,8 @@ prometheus-client = [ {file = "prometheus_client-0.11.0.tar.gz", hash = "sha256:3a8baade6cb80bcfe43297e33e7623f3118d660d41387593758e2fb1ea173a86"}, ] prompt-toolkit = [ - {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, - {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, + {file = "prompt_toolkit-3.0.20-py3-none-any.whl", hash = "sha256:6076e46efae19b1e0ca1ec003ed37a933dc94b4d20f486235d436e64771dcd5c"}, + {file = "prompt_toolkit-3.0.20.tar.gz", hash = "sha256:eb71d5a6b72ce6db177af4a7d4d7085b99756bf656d98ffcc4fecd36850eea6c"}, ] psycopg2-binary = [ {file = "psycopg2-binary-2.8.6.tar.gz", hash = "sha256:11b9c0ebce097180129e422379b824ae21c8f2a6596b159c7659e2e5a00e1aa0"}, @@ -2781,16 +2917,16 @@ pyflakes = [ {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, ] pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, ] pytest-cov = [ {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, @@ -2805,27 +2941,26 @@ pytest-django = [ {file = "pytest_django-4.4.0-py3-none-any.whl", hash = "sha256:65783e78382456528bd9d79a35843adde9e6a47347b20464eb2c885cb0f1f606"}, ] pytest-randomly = [ - {file = "pytest-randomly-3.8.0.tar.gz", hash = "sha256:d9e21a72446757129378beea00bc9a32df1fb1cfd0bbe408be1ae9685bdf1209"}, - {file = "pytest_randomly-3.8.0-py3-none-any.whl", hash = "sha256:f5b7a09e84ee1eabcdedbb73c51d0929ae2f582bab6941dbb513bb49296d6340"}, + {file = "pytest-randomly-3.10.1.tar.gz", hash = "sha256:d4ef5dbf27e542e6a4e4cec7a20ef3f1b906bce21fa340ca5657b5326ef23a64"}, + {file = "pytest_randomly-3.10.1-py3-none-any.whl", hash = "sha256:d28d490e3a743bdd64c5bc87c5fc182eac966ba6432c6bb6b224e32e76527e9e"}, ] pytest-testmon = [ - {file = "pytest-testmon-1.1.1.tar.gz", hash = "sha256:c8810f991545e352f646fb382e5962ff54b8aa52b09d62d35ae04f0d7a9c58d9"}, + {file = "pytest-testmon-1.2.0.tar.gz", hash = "sha256:2c61ae6185ea7dc07ea0d4db3984be62f1a176a5c16615fd208c5945aa411599"}, ] pytest-timeout = [ {file = "pytest-timeout-1.4.2.tar.gz", hash = "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76"}, {file = "pytest_timeout-1.4.2-py2.py3-none-any.whl", hash = "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063"}, ] python-decouple = [ - {file = "python-decouple-3.4.tar.gz", hash = "sha256:2e5adb0263a4f963b58d7407c4760a2465d464ee212d733e2a2c179e54c08d8f"}, - {file = "python_decouple-3.4-py3-none-any.whl", hash = "sha256:a8268466e6389a639a20deab9d880faee186eb1eb6a05e54375bdf158d691981"}, + {file = "python-decouple-3.5.tar.gz", hash = "sha256:68e4b3fcc97e24bc90eecc514852d0bf970f4ff031f5f7a6728ddafa9afefcaf"}, ] python-slugify = [ {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, ] pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, ] pyyaml = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, @@ -2866,8 +3001,8 @@ restructuredtext-lint = [ {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"}, ] "ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, - {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, + {file = "ruamel.yaml-0.17.16-py3-none-any.whl", hash = "sha256:ea21da1198c4b41b8e7a259301cc9710d3b972bf8ba52f06218478e6802dd1f1"}, + {file = "ruamel.yaml-0.17.16.tar.gz", hash = "sha256:1a771fc92d3823682b7f0893ad56cb5a5c87c48e62b5399d6f42c8759a583b33"}, ] "ruamel.yaml.clib" = [ {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, @@ -2913,8 +3048,8 @@ sortedcontainers = [ {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] sphinx = [ - {file = "Sphinx-4.1.1-py3-none-any.whl", hash = "sha256:3d513088236eef51e5b0adb78b0492eb22cc3b8ccdb0b36dd021173b365d4454"}, - {file = "Sphinx-4.1.1.tar.gz", hash = "sha256:23c846a1841af998cb736218539bb86d16f5eb95f5760b1966abcd2d584e62b8"}, + {file = "Sphinx-4.2.0-py3-none-any.whl", hash = "sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"}, + {file = "Sphinx-4.2.0.tar.gz", hash = "sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6"}, ] sphinx-autodoc-typehints = [ {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, @@ -2945,20 +3080,20 @@ sphinxcontrib-serializinghtml = [ {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sqlparse = [ - {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, - {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, + {file = "sqlparse-0.4.2-py3-none-any.whl", hash = "sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"}, + {file = "sqlparse-0.4.2.tar.gz", hash = "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae"}, ] stevedore = [ - {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"}, - {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"}, + {file = "stevedore-3.4.0-py3-none-any.whl", hash = "sha256:920ce6259f0b2498aaa4545989536a27e4e4607b8318802d7ddc3a533d3d069e"}, + {file = "stevedore-3.4.0.tar.gz", hash = "sha256:59b58edb7f57b11897f150475e7bc0c39c5381f0b8e3fa9f5c20ce6c89ec4aa1"}, ] structlog = [ {file = "structlog-21.1.0-py2.py3-none-any.whl", hash = "sha256:62f06fc0ee32fb8580f0715eea66cb87271eb7efb0eaf9af6b639cba8981de47"}, {file = "structlog-21.1.0.tar.gz", hash = "sha256:d9d2d890532e8db83c6977a2a676fb1889922ff0c26ad4dc0ecac26f9fafbc57"}, ] testfixtures = [ - {file = "testfixtures-6.18.0-py2.py3-none-any.whl", hash = "sha256:9bddf79b2dddb36420a20c25a65c827a8e7398c6ed4e2c75c2697857cb006be9"}, - {file = "testfixtures-6.18.0.tar.gz", hash = "sha256:d4bd1c4f90eac90a73e1bdc59c31d03943f218d687f3c5a09e48478841a8af5f"}, + {file = "testfixtures-6.18.3-py2.py3-none-any.whl", hash = "sha256:6ddb7f56a123e1a9339f130a200359092bd0a6455e31838d6c477e8729bb7763"}, + {file = "testfixtures-6.18.3.tar.gz", hash = "sha256:2600100ae96ffd082334b378e355550fef8b4a529a6fa4c34f47130905c7426d"}, ] text-unidecode = [ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, @@ -3016,17 +3151,17 @@ tornado = [ {file = "tornado-6.1.tar.gz", hash = "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791"}, ] traitlets = [ - {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, - {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, + {file = "traitlets-5.1.0-py3-none-any.whl", hash = "sha256:03f172516916220b58c9f19d7f854734136dd9528103d04e9bf139a92c9f54c4"}, + {file = "traitlets-5.1.0.tar.gz", hash = "sha256:bd382d7ea181fbbcce157c133db9a829ce06edffe097bcf3ab945b435452b46d"}, ] typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, ] urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, ] vine = [ {file = "vine-5.0.0-py2.py3-none-any.whl", hash = "sha256:4c9dceab6f76ed92105027c49c823800dd33cacce13bdedc5b914e3514b7fb30"}, @@ -3045,9 +3180,48 @@ win32-setctime = [ {file = "win32_setctime-1.0.3.tar.gz", hash = "sha256:4e88556c32fdf47f64165a2180ba4552f8bb32c1103a2fafd05723a0bd42bd4b"}, ] yamllint = [ - {file = "yamllint-1.26.1.tar.gz", hash = "sha256:87d9462b3ed7e9dfa19caa177f7a77cd9888b3dc4044447d6ae0ab233bcd1324"}, + {file = "yamllint-1.26.3.tar.gz", hash = "sha256:3934dcde484374596d6b52d8db412929a169f6d9e52e20f9ade5bf3523d9b96e"}, +] +yarl = [ + {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, + {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, + {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, + {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, + {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, + {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, + {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, + {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, + {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, + {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, + {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, + {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, + {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, ] diff --git a/github-stars/pyproject.toml b/github-stars/pyproject.toml index 6ced39a..043596c 100644 --- a/github-stars/pyproject.toml +++ b/github-stars/pyproject.toml @@ -15,7 +15,7 @@ authors = ["balsh"] [tool.poetry.dependencies] -python = "3.8.9" +python = "3.9.7" django = "^3" django-split-settings = "^1.0" django-axes = "^5.20" @@ -34,7 +34,7 @@ structlog = "^21.1" celery = "5.1.2" flower = "^1.0.0" celery_progress = "0.1.1" - +aiohttp = "3.7.4.post0" [tool.poetry.dev-dependencies] django-debug-toolbar = "^3.2" diff --git a/github-stars/server/apps/main/commands.py b/github-stars/server/apps/main/commands.py index 98f0ec8..d66ea27 100644 --- a/github-stars/server/apps/main/commands.py +++ b/github-stars/server/apps/main/commands.py @@ -1,93 +1,120 @@ -import requests -from requests.models import Response -from requests.auth import HTTPBasicAuth import re import time -from functools import lru_cache -from typing import Dict, Optional +import sys +from typing import Dict, Optional, Tuple from server.apps.main.celery_config import celery_app from server.settings.components.common import GIT_API_URL from celery_progress.backend import ProgressRecorder from celery import shared_task from server.settings.components import config +import aiohttp +import asyncio +import logging + +console_logger = logging.getLogger(__name__) +formatter = logging.Formatter(datefmt="%Y.%m.%d %H:%M:%S", + fmt='%(asctime)s | message: %(message)s') + # fmt='%(asctime)s | %(levelname)s | process: %(process)d | module name: %(name)s | ' + # 'func name: %(funcName)s | line number: %(lineno)s | message: %(message)s',) +handler = logging.StreamHandler(sys.stdout) +handler.setFormatter(formatter) +console_logger.setLevel(logging.INFO) +console_logger.addHandler(handler) -def current_page(response: Response, link: str) -> int: - url = str(response.links[f'{link}']['url']) - page_count = int(str(re.findall(pattern=r'page=\d+', string=url)[1]) - .replace('page=', '')) - return page_count +class GitHubScanner: + def __init__(self, user: str, token: str): + self.auth = aiohttp.BasicAuth(user, token) + self.data = {} + self.semaphore = asyncio.Semaphore(200) - -def github_request(url: str) -> Response: - auth = HTTPBasicAuth(config('GITHUB_USERNAME'), config('GITHUB_PASSWORD')) - counter = 0 - while True: + def _data_count(self) -> int: + repos_count = 0 try: - counter += 1 - if auth == HTTPBasicAuth('', ''): - response = requests.get(url) - else: - response = requests.get(url, auth=auth) - return response - except ConnectionError as connection_error: - if counter < 5: - time.sleep(10) - else: - raise connection_error + for data_set in self.data.values(): + repos_count += len(data_set['data']) + except ValueError: + console_logger.info(f'Data is empty') + return repos_count + + @staticmethod + def _page_count(url: str) -> int: + page = int(str(re.findall(pattern=r'&page=\d+', string=url)[-1]).replace('&page=', '')) + return page + + async def _github_request(self, session: aiohttp.ClientSession, url: str) -> Dict: + async with self.semaphore: + counter = 0 + while True: + try: + counter += 1 + resp = await session.get(url) + async with resp: + if resp.status == 200: + self.data[self._page_count(url)] = {'response': resp, 'data': await resp.json()} + return self.data[self._page_count(url)] + if resp.status >= 400: + return {'response': None, 'data': None} + except Exception as connection_error: + if counter < 5: + await asyncio.sleep(10) + else: + raise connection_error + + async def get_data(self, celery_task, username: str) -> None: + base_url = f'{GIT_API_URL}/{username}/repos?per_page=100&page=' + '{}' + progress_recorder = ProgressRecorder(celery_task) + connector = aiohttp.TCPConnector(limit=500) + async with aiohttp.ClientSession(auth=self.auth, connector=connector) as session: + url = base_url.format(1) + tasks = [] + try: + resp = await self._github_request(session, url) + self.data[1] = resp + last_page = self._page_count(dict(resp['response'].headers).get('Link')) + last_page_url = str(resp['response'].links['last']['url']) + if last_page: + data_last_page = await self._github_request(session, last_page_url) + repos_count = (last_page - 1) * 100 + len(data_last_page['data']) + for i in range(1, last_page): + url = base_url.format(i + 1) + current_repos_count = self._data_count() + percent = round(current_repos_count / repos_count * 100) + progress_recorder.set_progress(current_repos_count, repos_count, + description=f'Processing: {percent}%') + task = asyncio.create_task(self._github_request(session, url)) + tasks.append(task) + else: + tasks.append(asyncio.create_task(self._github_request(session, url))) + except Exception as e: + console_logger.error(e) + await asyncio.gather(*tasks) -@shared_task(bind=True) -def get_github_stars(self, username: str) -> Dict[str, Optional[int]]: - - url = f'{GIT_API_URL}/{username}/repos?per_page=100&page=1' - print(url) - progress_recorder = ProgressRecorder(self) - - response = github_request(url) - if response.status_code >= 400: +@celery_app.task(bind=True) +def get_github_stars(celery_task, username: str) -> Dict[str, Optional[int]]: + github = GitHubScanner(config('GITHUB_USERNAME'), config('GITHUB_TOKEN')) + loop = asyncio.get_event_loop() + loop.run_until_complete(github.get_data(celery_task, username)) + repos_data = github.data + data = {} + try: + for value in repos_data.values(): + for item in value['data']: + data[item["name"]] = item["stargazers_count"] + result = dict(sorted(data.items(), key=lambda x: x[1], reverse=True)) + except TypeError: result = {} - else: - repos = response.json() - - try: - page_count = current_page(response, 'last') - repos_count = (page_count - 1) * 100 + \ - len(github_request(response.links['last']['url']).json()) - except KeyError as e: - page_count = 1 - repos_count = len(repos) - - i = 0 - while 'next' in response.links.keys(): - i += 1 - response = github_request(response.links['next']['url']) - repos.extend(response.json()) - current = i * 100 + len(response.json()) - - # Progress bar - percent = round(100 / page_count * i) - progress_recorder.set_progress(current, repos_count, - description=f'Processing: {percent}%') - - # Fetching repos and stars in dict - data: Dict[str, int] = {} - try: - for item in repos: - data[item['name']] = int(item['stargazers_count']) - result = dict(sorted(data.items(), key=lambda x: x[1], reverse=True)) - except TypeError: - result = {} - return result +# Demo task @shared_task(bind=True) -def process_download(self): +def process_download(task) -> str: print('Task started') # Create the progress recorder instance # which we'll use to update the web page - progress_recorder = ProgressRecorder(self) + progress_recorder = ProgressRecorder(task) print('Start') for i in range(5): diff --git a/github-stars/server/apps/main/templates/base.html b/github-stars/server/apps/main/templates/base.html index 680d8ea..669da6a 100644 --- a/github-stars/server/apps/main/templates/base.html +++ b/github-stars/server/apps/main/templates/base.html @@ -11,7 +11,8 @@ - {% block demo %}{% endblock %} + {% block demo %} + {% endblock %} @@ -19,7 +20,8 @@ - {% block progress_bar_js %}{% endblock progress_bar_js %} + {% block progress_bar_js %} + {% endblock progress_bar_js %}
{{ message }} {% for repo, stars in data.items %} diff --git a/github-stars/server/apps/main/templates/download.html b/github-stars/server/apps/main/templates/download.html index ea6bac6..b21d5cc 100644 --- a/github-stars/server/apps/main/templates/download.html +++ b/github-stars/server/apps/main/templates/download.html @@ -34,7 +34,8 @@
- {% block progress %}{% endblock progress %} + {% block progress %} + {% endblock progress %}
{% endblock %} diff --git a/github-stars/server/apps/main/views.py b/github-stars/server/apps/main/views.py index 29f78e1..841b02b 100644 --- a/github-stars/server/apps/main/views.py +++ b/github-stars/server/apps/main/views.py @@ -1,13 +1,14 @@ from django.http import HttpRequest, HttpResponse from django.shortcuts import render, redirect -from django.urls import reverse +from django.urls import reverse, reverse_lazy from .forms import GithubForm from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.core.exceptions import ObjectDoesNotExist -from .commands import get_github_stars, process_download +from .commands import get_github_stars, console_logger, process_download from django.views.decorators.http import require_http_methods from celery.result import AsyncResult +from functools import lru_cache task_id = {} @@ -29,10 +30,9 @@ def github(request: HttpRequest) -> HttpResponse: try: email = getattr((User.objects.get(username=username)), 'email', 'default@email.ru') - except ObjectDoesNotExist as e: error = 'That user doesnt exists or not log on' - print(error, e) + console_logger.error(error, e) if request.method == 'POST': @@ -40,7 +40,7 @@ def github(request: HttpRequest) -> HttpResponse: result = get_github_stars.delay(github_username) task_id[username] = result.task_id - return redirect(reverse('github_result')) + return redirect(reverse_lazy('github_result')) form = GithubForm return render(request, 'main/github.html', @@ -53,18 +53,21 @@ def github_result(request: HttpRequest) -> HttpResponse: username = str(request.user.username) data = AsyncResult(task_id[username]) + result = {} + message = '' if data.ready(): message = "Result Ready" result = data.get() - print('result ready') + console_logger.info('result ready') else: - print('result not ready') + console_logger.info('result not ready') return render(request, 'main/github_result.html', context={'data': result, 'message': message}) +@lru_cache(maxsize=10) def demo_view(request: HttpRequest) -> HttpResponse: username = str(request.user.username) form = GithubForm @@ -79,11 +82,11 @@ def demo_view(request: HttpRequest) -> HttpResponse: message = f'Total repos: {len(result)}\n' if len(result) == 0: result = {'Error': 'User has no repositories!'} - print('Result ready! Please refresh page') + console_logger.info('Result ready! Please refresh page') else: - print('result not ready') + console_logger.info('result not ready') except KeyError as e: - print(e) + console_logger.error(e) finally: # Return demo view return render(request, 'progress.html', @@ -99,7 +102,7 @@ def demo_view(request: HttpRequest) -> HttpResponse: # Get ID task_id[username] = result.task_id # Print Task ID - print(f'Celery Task ID: {task_id[username]}') + console_logger.info(f'Celery Task ID: {task_id[username]}') # Return demo view with Task ID return render(request, 'progress.html', context={'task_id': task_id[username], diff --git a/new-github-repos/.dockerignore b/new-github-repos/.dockerignore deleted file mode 100644 index 374757d..0000000 --- a/new-github-repos/.dockerignore +++ /dev/null @@ -1,67 +0,0 @@ -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*,cover - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -# Docker -Dockerfile -docker-compose.yml -docker-compose.override.yml -docker/docker-compose.prod.yml - -# JetBrains -.idea/ diff --git a/new-github-repos/.editorconfig b/new-github-repos/.editorconfig deleted file mode 100644 index fa8404d..0000000 --- a/new-github-repos/.editorconfig +++ /dev/null @@ -1,25 +0,0 @@ -# Check http://editorconfig.org for more information -# This is the main config file for this project: -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -indent_style = space -indent_size = 2 -trim_trailing_whitespace = true - -[*.py] -indent_style = space -indent_size = 4 - -[*.pyi] -indent_style = space -indent_size = 4 - -[Makefile] -indent_style = tab - -[*.md] -trim_trailing_whitespace = false diff --git a/new-github-repos/.gitignore b/new-github-repos/.gitignore deleted file mode 100644 index 87d0206..0000000 --- a/new-github-repos/.gitignore +++ /dev/null @@ -1,247 +0,0 @@ -#### joe made this: https://goel.io/joe - -# Git style-guide: -# https://github.com/agis-/git-style-guide - -#####=== OSX ===##### -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two \r -Icon - - -# Thumbnails -._* - -# Files that might appear on external disk -.Spotlight-V100 -.Trashes - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -#####=== Windows ===##### -# Windows image file caches -Thumbs.db -ehthumbs.db - -# Folder config file -Desktop.ini - -# Recycle Bin used on file shares -$RECYCLE.BIN/ - -# Windows Installer files -*.cab -*.msi -*.msm -*.msp - -# Windows shortcuts -*.lnk - -#####=== Python ===##### - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] - -# C extensions -*.so - -# Distribution / packaging -.Python -env/ -develop-eggs/ -dist/ -downloads/ -eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -*.egg-info/ -.installed.cfg -*.egg - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.coverage -.cache -nosetests.xml -coverage.xml - -# Translations -*.mo -*.pot - -# Django stuff: -*.log - -# Sphinx documentation -docs/_build/ - -# PyBuilder -target/ - -#####=== Sass ===##### - -.sass-cache -*.css.map - -#####=== Yeoman ===##### - -node_modules/ -bower_components/ -*.log - -build/ -dist/ - -#####=== Vagrant ===##### -.vagrant/ - -#####=== Node ===##### - -# Logs -logs -*.log - -# Runtime data -pids -*.pid -*.seed - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directory -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git- -node_modules - -# Debug log from npm -npm-debug.log - -#### jetbrains #### -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm -# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 -# You can uncomment these lines to enable configuration sharing between -# team members, or you can restrict `.idea/` folder at all (default). - -# User-specific stuff: -# .idea/**/workspace.xml -# .idea/**/tasks.xml -# .idea/dictionaries - -# # Sensitive or high-churn files: -# .idea/**/dataSources/ -# .idea/**/dataSources.ids -# .idea/**/dataSources.xml -# .idea/**/dataSources.local.xml -# .idea/**/sqlDataSources.xml -# .idea/**/dynamic.xml -# .idea/**/uiDesigner.xml - -# # Gradle: -# .idea/**/gradle.xml -# .idea/**/libraries - -# # Mongo Explorer plugin: -# .idea/**/mongoSettings.xml - -# # Cursive Clojure plugin -# .idea/replstate.xml - -# Restrict `.idea/` folder at all: -.idea/ - -# CMake -cmake-build-debug/ - -## File-based project format: -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties -fabric.properties - - -#####=== Custom ===##### -# Directories: -media/ -.static/ -/static/ - -# File types: -*.sqlite3 -# .db - - -# Configuration file with private data: -# *.env -# .env - -# Local settings files: -*local.py - -# Deploy files for Docker: -docker-compose.deploy.yml - -# Certificates: -docker/caddy/certs/ - -# Artifacts: -.gitlab/.svn/ -artifacts/ - -# mypy: -.mypy_cache/ - -# pytest: -.pytest_cache/ - -# ipython: -.ipython/ diff --git a/new-github-repos/.gitlab-ci.yml b/new-github-repos/.gitlab-ci.yml deleted file mode 100644 index dc2d9cc..0000000 --- a/new-github-repos/.gitlab-ci.yml +++ /dev/null @@ -1,96 +0,0 @@ ---- - -variables: - GROUP_NAME: "balsh" - PROJECT_NAME: "github-repos" - REGISTRY: "registry.gitlab.com" - IMAGE_FULL_NAME: "${REGISTRY}/${GROUP_NAME}/${PROJECT_NAME}" - - -# Base scripts -# ============ - -.docker: - # We use a custom dind image that is based on raw `docker`, - # it has all the dependencies required. - # By using it we reduce the build time significantly. - # You can fallback to use raw `docker` image, see: - # https://github.com/wemake-services/wemake-dind/ - image: wemakeservices/wemake-dind:latest - interruptible: true - services: - - docker:dind - variables: - DOCKER_DRIVER: overlay2 - before_script: &docker-before-script - # Making sure we are in the right directory, does nothing by default: - - pwd && echo "$CI_PROJECT_DIR" && cd "$CI_PROJECT_DIR" - # Creating `.env` configuration file: - - dump-env -t config/.env.template -p 'SECRET_' > config/.env - # Login into Docker registry: - - echo "$CI_JOB_TOKEN" | docker login "$REGISTRY" - -u gitlab-ci-token --password-stdin - # Debug information: - - docker info && docker-compose --version && git --version - - -# Test scripts -# ============ - -test: - stage: test - extends: .docker - before_script: - - *docker-before-script - # Pulling cache: - - docker pull "${IMAGE_FULL_NAME}:dev" || true - - docker tag "${IMAGE_FULL_NAME}:dev" "${PROJECT_NAME}:dev" || true - script: - # Checking config: - - docker-compose -f docker-compose.yml - -f docker/docker-compose.prod.yml config --quiet - - # The logic itself: - - docker-compose build - - docker-compose run --user=root --rm web sh ./docker/ci.sh - - disl "${PROJECT_NAME}:dev" 950MiB - - # Pushing back the result for future runs: - - docker tag "${PROJECT_NAME}:dev" "${IMAGE_FULL_NAME}:dev" - - docker push "${IMAGE_FULL_NAME}:dev" - only: - - merge_requests - - -# Release scripts -# =============== - -# Releasing image, when in `master` branch, -# can be replaced with `kira-release` bot: -# https://github.com/wemake-services/kira-release -release-image: - extends: .docker - stage: deploy - allow_failure: false - before_script: - # Build local image to be released to gitlab registry, - # modify it to suite your needs as you wish. - # We only care about the name of the image: - - *docker-before-script - - # Now we need the latest images for cache and improved build times: - - docker pull "${IMAGE_FULL_NAME}:latest" || true - - docker pull "${IMAGE_FULL_NAME}:dev" || true - # Create correct tags: - - docker tag "${IMAGE_FULL_NAME}:latest" "${PROJECT_NAME}:latest" || true - - docker tag "${IMAGE_FULL_NAME}:dev" "${PROJECT_NAME}:dev" || true - - # Building the image itself: - - docker-compose -f docker-compose.yml - -f docker/docker-compose.prod.yml build - script: - - docker push "${IMAGE_FULL_NAME}:latest" - only: - - master - environment: - name: production # used to track time with 'cycle analytics' diff --git a/new-github-repos/.python-version b/new-github-repos/.python-version deleted file mode 100644 index 203e6d5..0000000 --- a/new-github-repos/.python-version +++ /dev/null @@ -1 +0,0 @@ -3.8.9 diff --git a/new-github-repos/CHANGELOG.md b/new-github-repos/CHANGELOG.md deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/README.md b/new-github-repos/README.md deleted file mode 100644 index 3228290..0000000 --- a/new-github-repos/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# github-repos - -github repos - -This project was generated with [`wemake-django-template`](https://github.com/wemake-services/wemake-django-template). Current template version is: [281e5b90040a710092c5be2dbd6b381c464cdf87](https://github.com/wemake-services/wemake-django-template/tree/281e5b90040a710092c5be2dbd6b381c464cdf87). See what is [updated](https://github.com/wemake-services/wemake-django-template/compare/281e5b90040a710092c5be2dbd6b381c464cdf87...master) since then. - - -[![wemake.services](https://img.shields.io/badge/%20-wemake.services-green.svg?label=%20&logo=data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC%2FxhBQAAAAFzUkdCAK7OHOkAAAAbUExURQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP%2F%2F%2F5TvxDIAAAAIdFJOUwAjRA8xXANAL%2Bv0SAAAADNJREFUGNNjYCAIOJjRBdBFWMkVQeGzcHAwksJnAPPZGOGAASzPzAEHEGVsLExQwE7YswCb7AFZSF3bbAAAAABJRU5ErkJggg%3D%3D)](https://wemake.services) -[![wemake-python-styleguide](https://img.shields.io/badge/style-wemake-000000.svg)](https://github.com/wemake-services/wemake-python-styleguide) - - -## Prerequisites - -You will need: - -- `python3.8` (see `pyproject.toml` for full version) -- `postgresql` with version `9.6` -- `docker` with [version at least](https://docs.docker.com/compose/compose-file/#compose-and-docker-compatibility-matrix) `18.02` - - -## Development - -When developing locally, we use: - -- [`editorconfig`](http://editorconfig.org/) plugin (**required**) -- [`poetry`](https://github.com/python-poetry/poetry) (**required**) -- `pycharm 2017+` or `vscode` - - -## Documentation - -Full documentation is available here: [`docs/`](docs). diff --git a/new-github-repos/config/.env b/new-github-repos/config/.env deleted file mode 100644 index 9f12c51..0000000 --- a/new-github-repos/config/.env +++ /dev/null @@ -1,43 +0,0 @@ -# === General === - -DOMAIN_NAME=localhost -TLS_EMAIL=webmaster@localhost - - -# === Django === -# Generate yours with: -# python3 -c 'from django.utils.crypto import get_random_string; print(get_random_string(50))' - -DJANGO_SECRET_KEY=I^[!b6gyNlXmaI,/{tagz+>:4V]%HJNW(=(@:*T~)g-t47tc7y - - -# === Database === - -# These variables are special, since they are consumed -# by both django and postgres docker image. -# Cannot be renamed if you use postgres in docker. -# See: https://hub.docker.com/_/postgres - -POSTGRES_DB=github-repos -POSTGRES_USER=github-admin -POSTGRES_PASSWORD=admin_password - -# Used only by django: -DJANGO_DATABASE_HOST=db -DJANGO_DATABASE_PORT=5432 - -# ==== Email ======= - -EMAIL_HOST=smtp.yandex.ru -EMAIL_HOST_USER=balsh-django@yandex.ru -EMAIL_HOST_PASSWORD=nifwotooabmfauld -EMAIL_PORT=465 -EMAIL_USE_SSL=True -EMAIL_USE_TLS=False - -# =======RabbitMQ======= - -RABBITMQ_DEFAULT_USER=rabbit_admin -RABBITMQ_DEFAULT_PASS=mypass -RABBITMQ_PORT=5672 -RABBITMQ_HOST=rabbitmq_docker diff --git a/new-github-repos/docker-compose.yml b/new-github-repos/docker-compose.yml deleted file mode 100644 index 523924f..0000000 --- a/new-github-repos/docker-compose.yml +++ /dev/null @@ -1,70 +0,0 @@ -#!/usr/bin/env bash - -version: "3.7" - -services: - db: - image: "postgres:12" - container_name: github_repos_db - restart: unless-stopped - volumes: - - pgdata:/var/lib/postgresql/data - networks: - - webnet - env_file: ./config/.env - ports: - - 5433:5432 - - web: - image: "github-repos" - container_name: github_repos_web - build: - context: . - dockerfile: ./docker/django/Dockerfile -# args: -# DJANGO_ENV: development -# cache_from: -# - "github-repos:dev" -# - "github-repos:latest" -# - "*" -# volumes: -# - django-static:/var/www/django/static - restart: unless-stopped - volumes: - - .:/code - ports: - - 8000:8000 - depends_on: - - db - networks: - - webnet - env_file: ./config/.env - command: > - bash -c "python manage.py migrate --noinput - && python -Wd manage.py runserver 0.0.0.0:8000" -# healthcheck: -# # We use `$$` here because: -# # one `$` goes to shell, -# # one `$` goes to `docker-compose.yml` escaping -# test: | -# /usr/bin/test $$( -# /usr/bin/curl --fail http://localhost:8000/health/?format=json -# --write-out "%{http_code}" --silent --output /dev/null -# ) -eq 200 -# interval: 10s -# timeout: 5s -# retries: 5 -# start_period: 30s - -# This task is an example of how to extend existing ones: -# some_worker: -# <<: *web -# command: python manage.py worker_process - -networks: - # Network for your internals, use it by default: - webnet: - -volumes: - pgdata: - django-static: diff --git a/new-github-repos/docker/caddy/Caddyfile b/new-github-repos/docker/caddy/Caddyfile deleted file mode 100644 index f368c74..0000000 --- a/new-github-repos/docker/caddy/Caddyfile +++ /dev/null @@ -1,40 +0,0 @@ -# See https://caddyserver.com/docs - -# Email for Let's Encrypt expiration notices -{ - email {$TLS_EMAIL} -} - -# "www" redirect to "non-www" version -www.{$DOMAIN_NAME} { - redir https://{$DOMAIN_NAME}{uri} -} - -{$DOMAIN_NAME} { - # HTTPS options: - header Strict-Transport-Security max-age=31536000; - - # Removing some headers for improved security: - header -Server - - # Exclude matcher for Django assets - @excludeDirs { - not path /static/* /media/* - } - - # Serving dynamic requests: - reverse_proxy @excludeDirs web:8000 - - # Serves static files, should be the same as `STATIC_ROOT` setting: - file_server { - root /var/www/django - } - - # Allows to use `.gz` files when available: - encode gzip - - # Logs: - log { - output stdout - } -} diff --git a/new-github-repos/docker/ci.sh b/new-github-repos/docker/ci.sh deleted file mode 100755 index 07f00f9..0000000 --- a/new-github-repos/docker/ci.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/env sh - -set -o errexit -set -o nounset - -# Initializing global variables and functions: -: "${DJANGO_ENV:=development}" - -# Fail CI if `DJANGO_ENV` is not set to `development`: -if [ "$DJANGO_ENV" != 'development' ]; then - echo 'DJANGO_ENV is not set to development. Running tests is not safe.' - exit 1 -fi - -pyclean () { - # Cleaning cache: - find . \ - | grep -E '(__pycache__|\.hypothesis|\.perm|\.cache|\.static|\.py[cod]$)' \ - | xargs rm -rf -} - -run_ci () { - echo '[ci started]' - set -x # we want to print commands during the CI process. - - # Testing filesystem and permissions: - touch .perm && rm -f .perm - touch '/var/www/django/media/.perm' && rm -f '/var/www/django/media/.perm' - touch '/var/www/django/static/.perm' && rm -f '/var/www/django/static/.perm' - - # Checking `.env` files: - dotenv-linter config/.env config/.env.template - - # Running linting for all python files in the project: - flake8 . - - # Running type checking, see https://github.com/typeddjango/django-stubs - mypy manage.py server $(find tests -name '*.py') - - # Running tests: - pytest --dead-fixtures - pytest - - # Run checks to be sure we follow all django's best practices: - python manage.py check --fail-level WARNING - - # Run checks to be sure settings are correct (production flag is required): - DJANGO_ENV=production python manage.py check --deploy --fail-level WARNING - - # Check that staticfiles app is working fine: - DJANGO_ENV=production DJANGO_COLLECTSTATIC_DRYRUN=1 \ - python manage.py collectstatic --no-input --dry-run - - # Check that all migrations worked fine: - python manage.py makemigrations --dry-run --check - - # Check that all migrations are backwards compatible: - python manage.py lintmigrations --exclude-apps=axes --warnings-as-errors - - # Checking if all the dependencies are secure and do not have any - # known vulnerabilities: - safety check --full-report - - # Checking `pyproject.toml` file contents: - poetry check - - # Checking dependencies status: - pip check - - # Checking docs: - doc8 -q docs - - # Checking `yaml` files: - yamllint -d '{"extends": "default", "ignore": ".venv"}' -s . - - # Checking translation files, ignoring ordering and locations: - polint -i location,unsorted locale - - # Also checking translation files for syntax errors: - if find locale -name '*.po' -print0 | grep -q "."; then - # Only executes when there is at least one `.po` file: - dennis-cmd lint --errorsonly locale - fi - - set +x - echo '[ci finished]' -} - -# Remove any cache before the script: -pyclean - -# Clean everything up: -trap pyclean EXIT INT TERM - -# Run the CI process: -run_ci diff --git a/new-github-repos/docker/django/Dockerfile b/new-github-repos/docker/django/Dockerfile deleted file mode 100644 index b82b3cd..0000000 --- a/new-github-repos/docker/django/Dockerfile +++ /dev/null @@ -1,46 +0,0 @@ -FROM python:3.8.9-slim-buster - -ENV BUILD_ONLY_PACKAGES='wget' \ - # python: - PYTHONFAULTHANDLER=1 \ - PYTHONUNBUFFERED=1 \ - PYTHONHASHSEED=random \ - PYTHONDONTWRITEBYTECODE=1 \ - # pip: - PIP_NO_CACHE_DIR=off \ - PIP_DISABLE_PIP_VERSION_CHECK=on \ - PIP_DEFAULT_TIMEOUT=100 \ - # poetry: - POETRY_VERSION=1.1.4 \ - POETRY_NO_INTERACTION=1 \ - POETRY_VIRTUALENVS_CREATE=false \ - POETRY_CACHE_DIR='/var/cache/pypoetry' \ - PATH="$PATH:/root/.poetry/bin" - -# System deps: -RUN apt-get update \ - && apt-get install --no-install-recommends -y \ - bash \ - build-essential \ - curl \ - gettext \ - git \ - libpq-dev \ - nano \ - # Defining build-time-only dependencies: - $BUILD_ONLY_PACKAGES \ - && curl -sSL 'https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py' | python \ - && poetry --version \ - # Removing build-time-only dependencies: - && apt-get remove -y $BUILD_ONLY_PACKAGES \ - # Cleaning cache: - && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ - && apt-get clean -y && rm -rf /var/lib/apt/lists/* \ - && rm -rf $POETRY_CACHE_DIR - -WORKDIR /code - -# Copy only requirements, to cache them in docker layer -COPY ./poetry.lock ./pyproject.toml /code/ -RUN poetry install -COPY . /code diff --git a/new-github-repos/docker/django/entrypoint.sh b/new-github-repos/docker/django/entrypoint.sh deleted file mode 100644 index 67d3e4a..0000000 --- a/new-github-repos/docker/django/entrypoint.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/usr/bin/env sh - -set -o errexit -set -o nounset - -readonly cmd="$*" - -postgres_ready () { - # Check that postgres is up and running on port `5432`: - dockerize -wait 'tcp://db:5432' -timeout 5s -} - -# We need this line to make sure that this container is started -# after the one with postgres: -until postgres_ready; do - >&2 echo 'Postgres is unavailable - sleeping' -done - -# It is also possible to wait for other services as well: redis, elastic, mongo ->&2 echo 'Postgres is up - continuing...' - -# Evaluating passed command (do not touch): -# shellcheck disable=SC2086 -exec $cmd diff --git a/new-github-repos/docker/django/gunicorn.sh b/new-github-repos/docker/django/gunicorn.sh deleted file mode 100644 index c110f6d..0000000 --- a/new-github-repos/docker/django/gunicorn.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env sh - -set -o errexit -set -o nounset - -# We are using `gunicorn` for production, see: -# http://docs.gunicorn.org/en/stable/configure.html - -# Check that $DJANGO_ENV is set to "production", -# fail otherwise, since it may break things: - - -echo "DJANGO_ENV is $DJANGO_ENV" -if [ "$DJANGO_ENV" != 'production' ]; then - echo 'Error: DJANGO_ENV is not set to "production".' - echo 'Application will not start.' - exit 1 -fi - -export DJANGO_ENV - - -# Run python specific scripts: -# Running migrations in startup script might not be the best option, see: -# docs/pages/template/production-checklist.rst -python /code/manage.py migrate --noinput -python /code/manage.py collectstatic --noinput -python /code/manage.py compilemessages - -# Start gunicorn: -# Docs: http://docs.gunicorn.org/en/stable/settings.html -# Concerning `workers` setting see: -# https://github.com/wemake-services/wemake-django-template/issues/1022 -/usr/local/bin/gunicorn server.wsgi \ - --workers=4 `# Sync worker settings` \ - --max-requests=2000 \ - --max-requests-jitter=400 \ - --bind='0.0.0.0:8000' `# Run Django on 8000 port` \ - --chdir='/code' `# Locations` \ - --log-file=- \ - --worker-tmp-dir='/dev/shm' diff --git a/new-github-repos/docker/docker-compose.prod.yml b/new-github-repos/docker/docker-compose.prod.yml deleted file mode 100644 index 815c6c1..0000000 --- a/new-github-repos/docker/docker-compose.prod.yml +++ /dev/null @@ -1,65 +0,0 @@ ---- - -# This compose-file is production only. So, it should not be called directly. -# -# Instead, it should be a part of your deploy strategy. -# This setup is supposed to be used with `docker-swarm`. -# See `./docs/pages/template/production.rst` docs. - -version: "3.6" -services: - caddy: - image: "caddy:2.2.1" - restart: unless-stopped - env_file: ./config/.env - volumes: - - ./docker/caddy/Caddyfile:/etc/caddy/Caddyfile # configuration - - caddy-config:/config # configuration autosaves - - caddy-data:/data # saving certificates - - django-static:/var/www/django/static # serving django's statics - - django-media:/var/www/django/media # serving django's media - ports: - - "80:80" - - "443:443" - depends_on: - - web - networks: - - proxynet - - web: - <<: &web - # Image for production: - image: "registry.gitlab.com/balsh/github-repos:latest" - build: - target: production_build - args: - DJANGO_ENV: production - - restart: unless-stopped - volumes: - - django-media:/var/www/django/media # since in dev it is app's folder - - django-locale:/code/locale # since in dev it is app's folder - - command: sh ./docker/django/gunicorn.sh - networks: - - proxynet - expose: - - 8000 - -# This task is an example of how to extend existing ones: -# some_wroker: -# <<: *web -# command: python manage.py worker_process -# deploy: -# replicas: 2 - -networks: - # Network for your proxy server and application to connect them, - # do not use it for anything else! - proxynet: - -volumes: - django-media: - django-locale: - caddy-config: - caddy-data: diff --git a/new-github-repos/docs/Makefile b/new-github-repos/docs/Makefile deleted file mode 100644 index 7af6a32..0000000 --- a/new-github-repos/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -SPHINXPROJ = wemake-django-template -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) \ No newline at end of file diff --git a/new-github-repos/docs/README.md b/new-github-repos/docs/README.md deleted file mode 100644 index e7061d1..0000000 --- a/new-github-repos/docs/README.md +++ /dev/null @@ -1,18 +0,0 @@ -# Starting with the docs - -We are using [Sphinx](http://www.sphinx-doc.org) to manage our documentation. -If you have never worked with `Sphinx` this guide -will cover the most common uses cases. - - -## Quickstart - -1. Clone this repository -2. Install dependencies, [here's how to do it](pages/template/development.rst) -3. Run `cd docs && make html` -4. Open `_build/html/index.html` with your browser - - -## Where to go next - -Read the main page of the opened documentation website. It will guide you. diff --git a/new-github-repos/docs/_static/.gitkeep b/new-github-repos/docs/_static/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/docs/_templates/moreinfo.html b/new-github-repos/docs/_templates/moreinfo.html deleted file mode 100644 index 1b45b2f..0000000 --- a/new-github-repos/docs/_templates/moreinfo.html +++ /dev/null @@ -1,28 +0,0 @@ -

- Links -

- - - - - diff --git a/new-github-repos/docs/conf.py b/new-github-repos/docs/conf.py deleted file mode 100644 index e6fc79f..0000000 --- a/new-github-repos/docs/conf.py +++ /dev/null @@ -1,136 +0,0 @@ -# wemake-django-template documentation build configuration file, created by -# sphinx-quickstart on Sat Sep 30 12:42:34 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. - -import os -import sys -from contextlib import suppress - -import tomlkit - -sys.path.insert(0, os.path.abspath('..')) - -# We need this block, because -# django might be not installed, maybe we are running our -# build process in ReadTheDocs? -# https://github.com/wemake-services/wemake-django-template/issues/133 -with suppress(ImportError): - import django # noqa: WPS433 - - # Normal django setup. That's how it should be in development: - os.environ['DJANGO_SETTINGS_MODULE'] = 'server.settings' - django.setup() - - -# -- Project information ----------------------------------------------------- - -def _get_project_meta(): - with open('../pyproject.toml') as pyproject: - file_contents = pyproject.read() - - return tomlkit.parse(file_contents)['tool']['poetry'] - - -pkg_meta = _get_project_meta() -project = str(pkg_meta['name']) -author = str(pkg_meta['authors'][0]) -copyright = author # noqa: WPS125 - -# The short X.Y version -version = str(pkg_meta['version']) -# The full version, including alpha/beta/rc tags -release = version - - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = '3.3' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.doctest', - 'sphinx.ext.todo', - 'sphinx.ext.coverage', - 'sphinx.ext.viewcode', - 'sphinx.ext.githubpages', - 'sphinx.ext.napoleon', - - # 3rd party, order matters: - # https://github.com/wemake-services/wemake-django-template/issues/159 - 'sphinx_autodoc_typehints', -] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -source_suffix = ['.rst'] - -# The master toctree document. -master_doc = 'index' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = True - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -html_theme_options = {} - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'about.html', - 'navigation.html', - 'moreinfo.html', - 'searchbox.html', - ], -} diff --git a/new-github-repos/docs/documents/.gitkeep b/new-github-repos/docs/documents/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/docs/index.rst b/new-github-repos/docs/index.rst deleted file mode 100644 index 02663d5..0000000 --- a/new-github-repos/docs/index.rst +++ /dev/null @@ -1,102 +0,0 @@ -Welcome to wemake-django-template's documentation! -================================================== - - -What this project is all about? -The main idea of this project is to provide a fully configured -template for ``django`` projects, where code quality, testing, -documentation, security, and scalability are number one priorities. - -This template is a result of implementing -`our processes `_, -it should not be considered as an independent part. - - -Goals ------ - -When developing this template we had several goals in mind: - -- Development environment should be bootstrapped easily, - so we use ``docker-compose`` for that -- Development should be consistent, so we use strict quality and style checks -- Development, testing, and production should have the same environment, - so again we develop, test, and run our apps in ``docker`` containers -- Documentation and codebase are the only sources of truth - - -Limitations ------------ - -This project implies that: - -- You are using ``docker`` for deployment -- You are using Gitlab and Gitlab CI -- You are not using any frontend assets in ``django``, - you store your frontend separately - - -Should I choose this template? ------------------------------- - -This template is oriented on big projects, -when there are multiple people working on it for a long period of time. - -If you want to simply create a working prototype without all these -limitations and workflows - feel free to choose any -`other template `_. - - -How to start ------------- - -You should start with reading the documentation. -Reading order is important. - -There are multiple processes that you need to get familiar with: - -- First time setup phase: what system requirements you must fulfill, - how to install dependencies, how to start your project -- Active development phase: how to make changes, run tests, - - -.. toctree:: - :maxdepth: 2 - :caption: Setting things up: - - pages/template/overview.rst - pages/template/development.rst - pages/template/django.rst - -.. toctree:: - :maxdepth: 2 - :caption: Quality assurance: - - pages/template/documentation.rst - pages/template/linters.rst - pages/template/testing.rst - pages/template/security.rst - pages/template/gitlab-ci.rst - -.. toctree:: - :maxdepth: 2 - :caption: Production: - - pages/template/production-checklist.rst - pages/template/production.rst - -.. toctree:: - :maxdepth: 1 - :caption: Extras: - - pages/template/upgrading-template.rst - pages/template/faq.rst - pages/template/troubleshooting.rst - - -Indexes and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/new-github-repos/docs/make.bat b/new-github-repos/docs/make.bat deleted file mode 100644 index b22d898..0000000 --- a/new-github-repos/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=wemake-django-template - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/new-github-repos/docs/pages/project/.gitkeep b/new-github-repos/docs/pages/project/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/docs/pages/template/development.rst b/new-github-repos/docs/pages/template/development.rst deleted file mode 100644 index 17218c8..0000000 --- a/new-github-repos/docs/pages/template/development.rst +++ /dev/null @@ -1,178 +0,0 @@ -Development -=========== - -Our development process is focused on high quality and development comfort. -We use tools that are proven to be the best in class. - -There are two possible ways to develop your apps. - -1. local development -2. development inside ``docker`` - -You can choose one or use both at the same time. -How to choose what method should you use? - -Local development is much easier and much faster. -You can choose it if you don't have too many infrastructure dependencies. -That's a default option for the new projects. - -Choosing ``docker`` development means that you already have a complex -setup of different technologies, containers, networks, etc. -This is a default option for older and more complicated projects. - - -Dependencies ------------- - -We use ``poetry`` to manage dependencies. -So, please do not use ``virtualenv`` or ``pip`` directly. -Before going any further, please, -take a moment to read the `official documentation `_ -about ``poetry`` to know some basics. - -If you are using ``docker`` then prepend ``docker-compose run --rm web`` -before any of those commands to execute them. - -Please, note that you don't need almost all of them with ``docker``. -You can just skip this sub-section completely. -Go right to `Development with docker`_. - -Installing dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -You do not need to run any of these command for ``docker`` based development, -since it is already executed inside ``Dockerfile``. - -Please, note that ``poetry`` will automatically create a ``virtualenv`` for -this project. It will use you current ``python`` version. -To install all existing dependencies run: - -.. code:: bash - - poetry install - -To install dependencies for production use, you will need to run: - -.. code:: bash - - poetry install --no-dev - -And to activate ``virtualenv`` created by ``poetry`` run: - -.. code:: bash - - poetry shell - -Adding new dependencies -~~~~~~~~~~~~~~~~~~~~~~~ - -To add a new dependency you can run: - -- ``poetry add django`` to install ``django`` as a production dependency -- ``poetry add --dev pytest`` to install ``pytest`` - as a development dependency - -This command might be used with ``docker``. - -Updating poetry version -~~~~~~~~~~~~~~~~~~~~~~~ - -Package managers should also be pinned very strictly. -We had a lot of problems in production -because we were not pinning package manager versions. - -This can result in broken ``lock`` files, inconsistent installation process, -bizarre bugs, and missing packages. You do not want to experience that! - -How can we have the same ``poetry`` version for all users in a project? -That's where ``[build-system]`` tag shines. It specifies the exact version of -your ``poetry`` installation that must be used for the project. -Version mismatch will fail your build. - -When you want to update ``poetry``, you have to bump it in several places: - -1. ``pyproject.toml`` -2. ``docker/django/Dockerfile`` - -Then you are fine! - - -Development with docker ------------------------ - -To start development server inside ``docker`` you will need to run: - -.. code:: bash - - docker-compose build - docker-compose run --rm web python manage.py migrate - docker-compose up - -Running scripts inside docker -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -As we have already mentioned inside the previous section -we use ``docker-compose run`` to run scripts inside docker. - -What do you need to know about it? - -1. You can run anything you want: ``poetry``, ``python``, ``sh``, etc -2. Most likely it will have a permanent effect, due to ``docker volumes`` -3. You need to use ``--rm`` to automatically remove this container afterward - -**Note**: ``docker`` commands do not need to use ``virtualenv`` at all. - -Extra configuration -~~~~~~~~~~~~~~~~~~~ - -You might want to tweak ``INTERNAL_IPS`` ``django`` setting -to include your ``docker`` container address into it. -Otherwise ``django-debug-toolbar`` might not show up. - -To get your ``docker`` ip run: - -.. code:: bash - - docker inspect your-container-name | grep -e '"Gateway"' - -You can also configure a permanent hostname inside your ``/etc/hosts`` to -access your ``docker`` containers with a permanent hostname. - - -Local development ------------------ - -When cloning a project for the first time you may -need to configure it properly, -see :ref:`django` section for more information. - -**Note**, that you will need to activate ``virtualenv`` created -by ``poetry`` before running any of these commands. -**Note**, that you only need to run these commands once per project. - -Local database -~~~~~~~~~~~~~~ - -When using local development environment without ``docker``, -you will need a ``postgres`` up and running. -To create new development database run -(make sure that database and user names are correct for your case): - -.. code:: bash - - psql postgres -U postgres -f sql/create_database.sql - -Then migrate your database: - -.. code:: bash - - python manage.py migrate - -Running project -~~~~~~~~~~~~~~~ - -If you have reached this point, you should be able to run the project. - -.. code:: bash - - python manage.py runserver diff --git a/new-github-repos/docs/pages/template/django.rst b/new-github-repos/docs/pages/template/django.rst deleted file mode 100644 index 86fb5fd..0000000 --- a/new-github-repos/docs/pages/template/django.rst +++ /dev/null @@ -1,167 +0,0 @@ -.. _django: - -Django -====== - - -Configuration -------------- - -We share the same configuration structure for almost every possible -environment. - -We use: - -- ``django-split-settings`` to organize ``django`` - settings into multiple files and directories -- ``.env`` files to store secret configuration -- ``python-decouple`` to load ``.env`` files into ``django`` - -Components -~~~~~~~~~~ - -If you have some specific components like ``celery`` or ``mailgun`` installed, -they could be configured in separate files. -Just create a new file in ``server/settings/components/``. -Then add it into ``server/settings/__init__.py``. - -Environments -~~~~~~~~~~~~ - -To run ``django`` on different environments just -specify ``DJANGO_ENV`` environment variable. -It must have the same name as one of the files -from ``server/settings/environments/``. -Then, values from this file will override other settings. - -Local settings -~~~~~~~~~~~~~~ - -If you need some specific local configuration tweaks, -you can create file ``server/settings/environments/local.py.template`` -to ``server/settings/environments/local.py``. -It will be loaded into your settings automatically if exists. - -.. code:: bash - - cp server/settings/environments/local.py.template server/settings/environments/local.py - -See ``local.py.template`` version for the reference. - - -Secret settings ---------------- - -We share the same mechanism for secret settings for all our tools. -We use ``.env`` files for ``django``, ``postgres``, ``docker``, etc. - -Initially, you will need to copy file -``config/.env.template`` to ``config/.env``: - -.. code:: bash - - cp config/.env.template config/.env - -When adding any new secret ``django`` settings you will need to: - -1. Add new key and value to ``config/.env`` -2. Add new key without value to ``config/.env.template``, - add a comment on how to get this value for other users -3. Add new variable inside ``django`` settings -4. Use ``python-decouple`` to load this ``env`` variable like so: - ``MY_SECRET = config('MY_SECRET')`` - - -Secret settings in production -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -We do not store our secret settings inside our source code. -All sensible settings are stored in ``config/.env`` file, -which is not tracked by the version control. - -So, how do we store secrets? We store them as secret environment variables -in `GitLab CI `_. -Then we use `dump-env `_ -to dump variables from both environment and ``.env`` file template. -Then, this file is copied inside ``docker`` image and when -this image is built - everything is ready for production. - -Here's an example: - -1. We add a ``SECRET_DJANGO_SECRET_KEY`` variable to Gitlab CI secret variables -2. Then ``dump-env`` dumps ``SECRET_DJANGO_SECRET_KEY`` - as ``DJANGO_SECRET_KEY`` and writes it to ``config/.env`` file -3. Then it is loaded by ``django`` inside the settings: - ``SECRET_KEY = config('DJANGO_SECRET_KEY')`` - -However, there are different options to store secret settings: - -- `ansible-vault `_ -- `git-secret `_ -- `Vault `_ - -Depending on a project we use different tools. -With ``dump-env`` being the default and the simplest one. - - -Extensions ----------- - -We use different ``django`` extensions that make your life easier. -Here's a full list of the extensions for both development and production: - -- `django-split-settings`_ - organize - ``django`` settings into multiple files and directories. - Easily override and modify settings. - Use wildcards in settings file paths and mark settings files as optional -- `django-axes`_ - keep track - of failed login attempts in ``django`` powered sites -- `django-csp`_ - `Content Security Policy`_ for ``django`` -- `django-referrer-policy`_ - middleware implementing the `Referrer-Policy`_ -- `django-health-check`_ - checks for various conditions and provides reports - when anomalous behavior is detected -- `django-add-default-value`_ - this django Migration Operation can be used to - transfer a Fields default value to the database scheme -- `django-deprecate-fields`_ - this package allows deprecating model fields and - allows removing them in a backwards compatible manner -- `django-migration-linter`_ - detect backward incompatible migrations for - your django project -- `zero-downtime-migrations`_ - apply ``django`` migrations on PostgreSql - without long locks on tables - -Development only extensions: - -- `django-debug-toolbar`_ - a configurable set of panels that - display various debug information about the current request/response -- `django-querycount`_ - middleware that prints the number - of DB queries to the runserver console -- `nplusone`_ - auto-detecting the `n+1 queries problem`_ in ``django`` - -.. _django-split-settings: https://github.com/sobolevn/django-split-settings -.. _django-axes: https://github.com/jazzband/django-axes -.. _django-csp: https://github.com/mozilla/django-csp -.. _`Content Security Policy`: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy -.. _django-referrer-policy: https://github.com/ubernostrum/django-referrer-policy -.. _`Referrer-Policy`: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy -.. _django-health-check: https://github.com/KristianOellegaard/django-health-check -.. _django-add-default-value: https://github.com/3YOURMIND/django-add-default-value -.. _django-deprecate-fields: https://github.com/3YOURMIND/django-deprecate-fields -.. _django-migration-linter: https://github.com/3YOURMIND/django-migration-linter -.. _zero-downtime-migrations: https://github.com/yandex/zero-downtime-migrations -.. _django-debug-toolbar: https://github.com/jazzband/django-debug-toolbar -.. _django-querycount: https://github.com/bradmontgomery/django-querycount -.. _nplusone: https://github.com/jmcarp/nplusone -.. _`n+1 queries problem`: https://stackoverflow.com/questions/97197/what-is-the-n1-select-query-issue - - -Further reading ---------------- - -- `django-split-settings tutorial `_ -- `docker env-file docs `_ - - -Django admin -~~~~~~~~~~~~ - -- `Django Admin Cookbook `_ diff --git a/new-github-repos/docs/pages/template/documentation.rst b/new-github-repos/docs/pages/template/documentation.rst deleted file mode 100644 index 7a6491e..0000000 --- a/new-github-repos/docs/pages/template/documentation.rst +++ /dev/null @@ -1,98 +0,0 @@ -Documentation -============= - -`We `_ write a lot of documentation. -Since we believe, that documentation is a crucial factor -which defines project success or failure. - -Here's how we write docs for ``django`` projects. - - -Dependencies ------------- - -We are using ``sphinx`` as a documentation builder. -We use ``sphinx.ext.napoleon`` to write -pretty docstrings inside the source code. -We also use ``sphinx_autodoc_typehints`` to inject type annotations into docs. - -We also use two sources of truth for the dependencies here: - -- ``docs/requirements.txt`` -- ``pyproject.toml`` - -Why? Because we are using ReadTheDocs -for this template (only for original Github repo), and it -does only support traditional ``requirements.txt``. - - -Structure ---------- - -We use a clear structure for this documentation. - -- ``pages/template`` contains docs - from `wemake-django-template `_. - These files should not be modified locally. - If you have any kind of question or problems, - just open an issue `on github `_ -- ``pages/project`` contains everything related to the project itself. - Usage examples, an auto-generated documentation from your source code, - configuration, business, and project goals -- ``documents`` contains different non-sphinx documents - like ``doc`` files, spreadsheets, and mockups - -Please, do not mix it up. - -How to structure project docs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It is a good practice to write a single ``rst`` document -for every single ``py`` file. -Obviously, ``rst`` structure fully copies the structure of your source code. -This way it is very easy to navigate through the docs, -since you already know the structure. - -For each ``django`` application we tend to create -a file called ``index.rst`` which is considered -the main file for the application. - -And ``pages/project/index.rst`` is the main file for the whole project. - - -How to contribute ------------------ - -We enforce everyone to write clean and explaining documentation. -However, there are several rules about writing styling. - -We are using `doc8 `_ to validate our docs. -So, here's the command to do it: - -.. code:: bash - - doc8 ./docs - -This is also used in our CI process, so your build will fail -if there are violations. - - -Useful plugins --------------- - -Some ``sphinx`` plugins are not included, since they are very specific. -However, they are very useful: - -- `sphinxcontrib-mermaid `_ - sphinx plugin to create general flowcharts, sequence and gantt diagrams -- `sphinxcontrib-plantuml `_ - sphinx plugin to create UML diagrams -- `nbsphinx `_ - sphinx plugin to embed ``ipython`` notebooks into your docs - - -Further reading ---------------- - -- `sphinx `_ -- `sphinx with django `_ -- `sphinx-autodoc-typehints `_ -- `Architecture Decision Record (ADR) `_ -- `adr-tools `_ diff --git a/new-github-repos/docs/pages/template/faq.rst b/new-github-repos/docs/pages/template/faq.rst deleted file mode 100644 index a01c18f..0000000 --- a/new-github-repos/docs/pages/template/faq.rst +++ /dev/null @@ -1,29 +0,0 @@ -Frequently asked questions -========================== - -Will you ever support drf / celery / flask / gevent? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -No. This template is focused on bringing best practices to ``django`` -projects. It only includes workflow and configuration for this framework. - -Other tools are not mandatory. And can easily be added by a developer. - -Will you have an build-time option to include or change anything? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -No, we believe that options bring inconsistencies to the project. -You can also make the wrong choice. So, we are protecting you from that. - -You can only have options that are already present in this template. -Fork it, if you do not agree with this policy. - -This code quality is unbearable! Can I turn it off? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Of course, no one can stop you from that. -But what the point in using this template then? - -Our code quality defined by this template is minimally acceptable. -We know tools to make it even better. But they are not included. -Since they are literally hardcore. diff --git a/new-github-repos/docs/pages/template/gitlab-ci.rst b/new-github-repos/docs/pages/template/gitlab-ci.rst deleted file mode 100644 index d7ef0e4..0000000 --- a/new-github-repos/docs/pages/template/gitlab-ci.rst +++ /dev/null @@ -1,56 +0,0 @@ -Gitlab CI -========= - -We use ``Gitlab CI`` to build our containers, test it, -and store them in the internal registry. - -These images are then pulled into the production servers. - - -Configuration -------------- - -All configuration is done inside ``.gitlab-ci.yml``. - - -Pipelines ---------- - -We have two pipelines configured: for ``master`` and other branches. -That's how it works: we only run testing for feature branches and do the whole -building/testing/deploying process for the ``master`` branch. - -This allows us to speed up development process. - - -Automatic dependencies update ------------------------------ - -You can use `dependabot `_ -to enable automatic dependencies updates via Pull Requests to your repository. -Similar to the original template repository: `list of pull requests `_. - -It is available to both Github and Gitlab. -But, for Gitlab version you currently have to update your `.gitlab-ci.yml `_. - - -Secret variables ----------------- - -If some real secret variables are required, then you can use `gitlab secrets `_. -And these kind of variables are required *most* of the time. - -See :ref:`django` on how to use ``dump-env`` and ``gitlab-ci`` together. - - -Documentation -------------- -After each deploy from master branch this documentation compiles into nice looking html page. -See `gitlab pages info `_. - - -Further reading ---------------- - -- `Container Registry `_ -- `Gitlab CI/CD `_ diff --git a/new-github-repos/docs/pages/template/linters.rst b/new-github-repos/docs/pages/template/linters.rst deleted file mode 100644 index 7191e02..0000000 --- a/new-github-repos/docs/pages/template/linters.rst +++ /dev/null @@ -1,130 +0,0 @@ -.. _linters: - -Linters -======= - -This project uses several linters to make coding style consistent. -All configuration is stored inside ``setup.cfg``. - - -wemake-python-styleguide ------------------------- - -``wemake-python-styleguide`` is a ``flake8`` based plugin. -And it is also the strictest and most opinionated python linter ever. -See `wemake-python-styleguide `_ -docs. - -Things that are included in the linting process: - -- `flake8 `_ is used a general tool for linting -- `isort `_ is used to validate ``import`` order -- `bandit `_ for static security checks -- `eradicate `_ to find dead code -- and more! - -Running linting process for all ``python`` files in the project: - -.. code:: bash - - flake8 . - -Extra plugins -~~~~~~~~~~~~~ - -We also use some extra plugins for ``flake8`` -that are not bundled with ``wemake-python-styleguide``: - -- `flake8-pytest `_ - ensures that ``pytest`` best practices are used -- `flake8-pytest-style `_ - ensures that ``pytest`` tests and fixtures are written in a single style -- `flake8-django `_ - plugin to enforce best practices in a ``django`` project - - -django-migration-linter ------------------------ - -We use ``django-migration-linter`` to find backward incompatible migrations. -It allows us to write 0-downtime friendly code. - -See `django-migration-linter `_ -docs, it contains a lot of useful information about ways and tools to do it. - -That's how this check is executed: - -.. code:: bash - - python manage.py lintmigrations --exclude-apps=axes - -Important note: you might want to exclude some packages with broken migrations. -Sometimes, there's nothing we can do about it. - - -yamllint --------- - -Is used to lint your ``yaml`` files. -See `yamllint `_ docs. - -.. code:: bash - - yamllint -d '{"extends": "default", "ignore": ".venv"}' -s . - - -dotenv-linter -------------- - -Is used to lint your ``.env`` files. -See `dotenv-linter `_ docs. - -.. code:: bash - - dotenv-linter config/.env config/.env.template - - -polint and dennis ------------------ - -Are used to lint your ``.po`` files. -See `polint `_ docs. -Also see `dennis `_ docs. - -.. code:: bash - - polint -i location,unsorted locale - dennis-cmd lint --errorsonly locale - - -Packaging ---------- - -We also use ``pip`` and ``poetry`` self checks to be sure -that packaging works correctly. - -.. code:: bash - - poetry check && pip check - - -Linters that are not included ------------------------------ - -Sometimes we use several other linters that are not included. -That's because they require another technology stack to be installed -or just out of scope. - -We also recommend to check the list of linters -`recommended by wemake-python-styleguide `_. - -Here's the list of these linters. You may still find them useful. - -shellcheck -~~~~~~~~~~ - -This linter is used to lint your ``.sh`` files. -See `shellcheck `_ docs. - -hadolint -~~~~~~~~ - -This linter is used to lint your ``Dockerfile`` syntax. -See `hadolint `_ diff --git a/new-github-repos/docs/pages/template/overview.rst b/new-github-repos/docs/pages/template/overview.rst deleted file mode 100644 index 8225701..0000000 --- a/new-github-repos/docs/pages/template/overview.rst +++ /dev/null @@ -1,135 +0,0 @@ -Overview -======== - - -System requirements -------------------- - -- ``git`` with a version at least ``2.16`` or higher -- ``docker`` with a version at least ``18.02`` or higher -- ``docker-compose`` with a version at least ``1.21`` or higher -- ``python`` with exact version, see ``pyproject.toml`` - - -Architecture ------------- - -config -~~~~~~ - -- ``config/.env.template`` - a basic example of what keys must be contained in - your ``.env`` file, this file is committed to VCS - and must not contain private or secret values -- ``config/.env`` - main file for secret configuration, - contains private and secret values, should not be committed to VCS - -root project -~~~~~~~~~~~~ - -- ``README.md`` - main readme file, it specifies the entry - point to the project's documentation -- ``.dockerignore`` - specifies what files should not be - copied to the ``docker`` image -- ``.editorconfig`` - file with format specification. - You need to install the required plugin for your IDE in order to enable it -- ``.gitignore`` - file that specifies - what should we commit into the repository and we should not -- ``.gitlab-ci.yml`` - GitLab CI configuration file. - It basically defines what to do with your project - after pushing it to the repository. Currently it is used for testing - and releasing a ``docker`` image -- ``docker-compose.yml`` - this the file specifies ``docker`` services - that are needed for development and testing -- ``docker-compose.override.yml`` - local override for ``docker-compose``. - Is applied automatically and implicitly when - no arguments provided to ``docker-compose`` command -- ``manage.py`` - main file for your ``django`` project. - Used as an entry point for the ``django`` project -- ``pyproject.toml`` - main file of the project. - It defines the project's dependencies. -- ``poetry.lock`` - lock file for dependencies. - It is used to install exactly the same versions of dependencies on each build -- ``setup.cfg`` - configuration file, that is used by all tools in this project -- ``locale/`` - helper folder, that is used to store locale data, - empty by default -- ``sql/`` - helper folder, that contains ``sql`` script for database setup - and teardown for local development - -server -~~~~~~ - -- ``server/__init__.py`` - package definition, empty file -- ``server/urls.py`` - ``django`` `urls definition `_ -- ``server/wsgi.py`` - ``django`` `wsgi definition `_ -- ``server/apps/`` - place to put all your apps into -- ``server/apps/main`` - ``django`` application, used as an example, - could be removed -- ``server/settings`` - settings defined with ``django-split-settings``, - see this `tutorial `_ - for more information -- ``server/templates`` - external folder for ``django`` templates, - used for simple files as ``robots.txt`` and so on - -docker -~~~~~~ - -- ``docker/ci.sh`` - file that specifies all possible checks that - we execute during our CI process -- ``docker/docker-compose.prod.yml`` - additional service definition file - used for production -- ``docker/django/Dockerfile`` - ``django`` container definition, - used both for development and production -- ``docker/django/entrypoint.sh`` - entry point script that is used - when ``django`` container is starting -- ``docker/django/gunicorn.sh`` - production script for ``django``, - that's how we configure ``gunicorn`` runner -- ``docker/caddy/Caddyfile`` - configuration file for Caddy webserver - -tests -~~~~~ - -- ``tests/test_server`` - tests that ensures that basic ``django`` - stuff is working, should not be removed -- ``tests/test_apps/test_main`` - example tests for the ``django`` app, - could be removed -- ``tests/conftest.py`` - main configuration file for ``pytest`` runner - -docs -~~~~ - -- ``docs/Makefile`` - command file that builds the documentation for Unix -- ``docs/make.bat`` - command file for Windows -- ``docs/conf.py`` - ``sphinx`` configuration file -- ``docs/index.rst`` - main documentation file, used as an entry point -- ``docs/pages/project`` - folder that will contain - documentation written by you! -- ``docs/pages/template`` - folder that contains documentation that - is common for each project built with this template -- ``docs/documents`` - folder that should contain any documents you have: - spreadsheets, images, requirements, presentations, etc -- ``docs/requirements.txt`` - helper file, contains dependencies - for ``readthedocs`` service. Can be removed -- ``docs/README.rst`` - helper file for this directory, - just tells what to do next - - -Container internals -------------------- - -We use the ``docker-compose`` to link different containers together. -We also utilize different ``docker`` networks to control access. - -Some containers might have long starting times, for example: - -- ``postgres`` -- ``rabbitmq`` -- frontend, like ``node.js`` - -To be sure that container is started at the right time, -we utilize ``dockerize`` `script `_. -It is executed inside ``docker/django/entrypoint.sh`` file. - -We start containers with ``tini``. -Because this way we have a proper signal handling -and eliminate zombie processes. -Read the `official docs `_ to know more. diff --git a/new-github-repos/docs/pages/template/production-checklist.rst b/new-github-repos/docs/pages/template/production-checklist.rst deleted file mode 100644 index 2c69d36..0000000 --- a/new-github-repos/docs/pages/template/production-checklist.rst +++ /dev/null @@ -1,186 +0,0 @@ -.. _`going-to-production`: - -Going to production -=================== - -This section covers everything you need to know before going to production. - - -Django ------- - -Checks -~~~~~~ - -Before going to production make sure you have checked everything: - -1. Migrations are up-to-date -2. Static files are all present -3. There are no security or other ``django`` warnings - -Checking migrations, static files, -and security is done inside ``ci.sh`` script. - -We check that there are no unapplied migrations: - -.. code :: bash - - python manage.py makemigrations --dry-run --check - -If you have forgotten to create a migration and changed the model, -you will see an error on this line. - -We also check that static files can be collected: - -.. code :: bash - - DJANGO_ENV=production python manage.py collectstatic --no-input --dry-run - -However, this check does not cover all the cases. -Sometimes ``ManifestStaticFilesStorage`` will fail on real cases, -but will pass with ``--dry-run`` option. -You can disable ``--dry-run`` option if you know what you are doing. -Be careful with this option, when working with auto-uploading -your static files to any kind of CDNs. - -That's how we check ``django`` warnings: - -.. code:: bash - - DJANGO_ENV=production python manage.py check --deploy --fail-level WARNING - -These warnings are raised by ``django`` -when it detects any configuration issues. - -This command should give not warnings or errors. -It is bundled into `docker`, so the container will not work with any warnings. - -Static and media files -~~~~~~~~~~~~~~~~~~~~~~ - -We use ``/var/www/django`` folder to store our media -and static files in production as ``/var/www/django/static`` -and ``/var/www/django/media``. -Docker uses these two folders as named volumes. -And later these volumes are also mounted to ``caddy`` -with ``ro`` mode so it possible to read their contents. - -To find the exact location of these files on your host -you will need to do the following: - -.. code:: bash - - docker volume ls # to find volumes' names - docker volume inspect VOLUME_NAME - -Sometimes storing your media files inside a container is not a good idea. -Use ``CDN`` when you have a lot of user content -or it is very important not to lose it. -There are `helper libraries `_ -to bind ``django`` and these services. - -If you don't need ``media`` files support, just remove the volumes. - -Migrations -~~~~~~~~~~ - -We do run migration in the ``gunicorn.sh`` by default. -Why do we do this? Because that's probably the easiest way to do it. -But it clearly has some disadvantages: - -- When scaling your container for multiple nodes you will have multiple - threads running the same migrations. And it might be a problem since - migrations do not guarantee that it will work this way. -- You can perform some operations multiple times -- Possible other evil things may happen - -So, what to do in this case? -Well, you can do whatever it takes to run migrations in a single thread. -For example, you can create a separate container to do just that. -Other options are fine as well. - - -Postgres --------- - -Sometimes using ``postgres`` inside a container -`is not a good idea `_. -So, what should be done in this case? - -First of all, move your database ``docker`` service definition -inside ``docker-compose.override.yml``. -Doing so will not affect development, -but will remove database service from production. -Next, you will need to specify `extra_hosts `_ -to contain your ``postgresql`` address. -Lastly, you would need to add new hosts to ``pg_hba.conf``. - -`Here `_ -is a nice tutorial about this topic. - - -Caddy ------ - -Let's Encrypt -~~~~~~~~~~~~~ - -We are using ``Caddy`` and ``Let's Encrypt`` for HTTPS. -The Caddy webserver used in the default configuration will get -you a valid certificate from ``Let's Encrypt`` and update it automatically. -All you need to do to enable this is to make sure -that your DNS records are pointing to the server Caddy runs on. - -Read more: `Automatic HTTPS `_ -in Caddy docs. - -Caddyfile validation -~~~~~~~~~~~~~~~~~~~~ - -You can also run ``-validate`` command to validate ``Caddyfile`` contents. - -Here's it would look like: - -.. code:: bash - - docker-compose -f docker-compose.yml -f docker/docker-compose.prod.yml - run --rm caddy -validate - -This check is not included in the pipeline by default, -because it is quite long to start all the machinery for this single check. - -Disabling HTTPS -~~~~~~~~~~~~~~~ - -You would need to `disable `_ -``https`` inside ``Caddy`` and in production settings for Django. -Because Django itself also redirects to `https`. -See `docs `_. - -You would also need to disable ``manage.py check`` -in ``docker/ci.sh``. -Otherwise, your application won't start, -it would not pass ``django``'s security checks. - -Disabling WWW subdomain -~~~~~~~~~~~~~~~~~~~~~~~ - -If you for some reason do not require ``www.`` subdomain, -then delete ``www.{$DOMAIN_NAME}`` section from ``Caddyfile``. - -Third-Level domains -~~~~~~~~~~~~~~~~~~~ - -You have to disable ``www`` subdomain if -your app works on third-level domains like: - -- ``kira.wemake.services`` -- ``support.myapp.com`` - -Otherwise, ``Caddy`` will server redirects to ``www.example.yourdomain.com``. - - -Further reading ---------------- - -- Django's deployment `checklist `_ diff --git a/new-github-repos/docs/pages/template/production.rst b/new-github-repos/docs/pages/template/production.rst deleted file mode 100644 index ceffd5a..0000000 --- a/new-github-repos/docs/pages/template/production.rst +++ /dev/null @@ -1,77 +0,0 @@ -Production -========== - -We use different tools and setup for production. -We do not fully provide this part with the template. Why? - -1. It requires a lot of server configuration -2. It heavily depends on your needs: performance, price, technology, etc -3. It is possible to show some vulnerable parts to possible attackers - -So, you will need to deploy your application by yourself. -Here, we would like to cover some basic things that are not changed -from deployment strategy. - -The easiest deployment strategy for small apps is ``docker-compose`` and -``systemd`` inside a host operating system. - - -Production configuration ------------------------- - -You will need to specify extra configuration -to run ``docker-compose`` in production. -Since production build also uses ``caddy``, -which is not required into the development build. - -.. code:: bash - - docker-compose -f docker-compose.yml -f docker/docker-compose.prod.yml up - - -Pulling pre-built images ------------------------- - -You will need to pull pre-built images from ``Gitlab`` to run them. -How to do that? - -The first step is to create a personal access token for this service. -Then, login into your registry with: - -.. code:: bash - - docker login registry.gitlab.your.domain - -And now you are ready to pull your images: - -.. code:: bash - - docker pull your-image:latest - -See `official Gitlab docs `_. - - -Updating already running service --------------------------------- - -If you need to update an already running service, -them you will have to use ``docker service update`` -or ``docker stack deploy``. - -Updating existing `service `_. -Updating existing `stack `_. - -Zero-Time Updates -~~~~~~~~~~~~~~~~~ - -Zero-Time Updates can be tricky. -You need to create containers with the new code, update existing services, -wait for the working sessions to be completed, and to shut down old -containers. - - -Further reading ---------------- - -- Production with `docker-compose `_ -- `Full tutorial `_ diff --git a/new-github-repos/docs/pages/template/security.rst b/new-github-repos/docs/pages/template/security.rst deleted file mode 100644 index 368f6c6..0000000 --- a/new-github-repos/docs/pages/template/security.rst +++ /dev/null @@ -1,114 +0,0 @@ -Security -======== - -Security is our first priority. -We try to make projects as secure as possible. -We use a lot of 3rd party tools to achieve that. - - -Django ------- - -Django has a lot of `security-specific settings `_ -that are all turned on by default in this template. - -We also :ref:`enforce ` all the best practices -by running ``django`` checks inside CI for each commit. - -We also use a set of custom ``django`` apps -to enforce even more security rules: - -- `django-axes `_ to track and ban repeating access requests -- `django-csp `_ to enforce `Content-Security Policy `_ for our webpages -- `django-http-referrer-policy `_ to enforce `Referrer Policy `_ for our webpages - -And there are also some awesome extensions that are not included: - -- `django-honeypot `_ - django application that provides utilities for preventing automated form spam - -Passwords -~~~~~~~~~ - -We use strong algorithms for password hashing: -``bcrypt``, ``PBKDF2`` and ``Argon2`` which are known to be secure enough. - - -Dependencies ------------- - -We use `poetry `_ which ensures -that all the dependencies hashes match during the installation process. -Otherwise, the build will fail. -So, it is almost impossible to replace an already existing package -with a malicious one. - -We also use `safety `_ -to analyze vulnerable dependencies to prevent the build -to go to the production with known unsafe dependencies. - -.. code:: bash - - safety check - -We also use `Github security alerts `_ -for our main template repository. - - -Static analysis ---------------- - -We use ``wemake-python-styleguide`` which -includes `bandit `_ security checks inside. - -You can also install `pyt `_ -which is not included by default. -It will include even more static checks for -``sql`` injections, ``xss`` and others. - - -Dynamic analysis ----------------- - -You can monitor your running application to detect anomalous activities. -Tools to consider: - -- `dagda `_ - a tool to perform static analysis of known vulnerabilities, trojans, viruses, malware & other malicious threats in docker images/containers and to monitor the docker daemon and running docker containers for detecting anomalous activities - -All the tools above are not included into this template. -You have to install them by yourself. - - -Secrets -------- - -We store secrets separately from code. So, it is harder for them to leak. -However, we encourage to use tools like -`truffleHog `_ or `detect-secrets `_ inside your workflow. - -You can also turn on `Gitlab secrets checker `_ which we highly recommend. - - -Audits ------- - -The only way to be sure that your app is secure -is to constantly audit it in production. - -There are different tools to help you: - -- `twa `_ - tiny web auditor that has a lot of security checks for the webpages -- `XSStrike `_ - automated tool to check that your application is not vulnerable to ``xss`` errors -- `docker-bench `_ - a script that checks for dozens of common best-practices around deploying Docker containers in production -- `lynis `_ - a battle-tested security tool for systems running Linux, macOS, or Unix-based operating system -- `trivy `_ - a simple and comprehensive vulnerability scanner for containers - -But, even after all you attempts to secure your application, -it **won't be 100% safe**. Do not fall into this false feeling of security. - - -Further reading ---------------- - -- `Open Web Application Security Project `_ -- `Docker security `_ -- `AppArmor `_ and `bane `_ diff --git a/new-github-repos/docs/pages/template/testing.rst b/new-github-repos/docs/pages/template/testing.rst deleted file mode 100644 index a689760..0000000 --- a/new-github-repos/docs/pages/template/testing.rst +++ /dev/null @@ -1,111 +0,0 @@ -Testing -======= - -We try to keep our quality standards high. -So, we use different tools to make this possible. - -We use `mypy `_ for optional -static typing. -We run tests with `pytest `_ framework. - - -pytest ------- - -``pytest`` is the main tool for test discovery, collection, and execution. -It is configured inside ``setup.cfg`` file. - -We use a lot of ``pytest`` plugins that enhance our development experience. -List of these plugins is available inside ``pyproject.toml`` file. - -Running: - -.. code:: bash - - pytest - -We also have some options that are set on each run via ``--addopts`` -inside the ``setup.cfg`` file. - -Plugins -~~~~~~~ - -We use different ``pytest`` plugins to make our testing process better. -Here's the full list of things we use: - -- `pytest-django`_ - plugin that introduce a lot of ``django`` specific - helpers, fixtures, and configuration -- `django-test-migrations`_ - plugin to test Django migrations and their order -- `pytest-cov`_ - plugin to measure test coverage -- `pytest-randomly`_ - plugin to execute tests in random order and - also set predictable random seed, so you can easily debug - what went wrong for tests that rely on random behavior -- `pytest-deadfixtures`_ - plugin to find unused or duplicate fixtures -- `pytest-timeout`_ - plugin to raise errors for tests - that take too long to finish, this way you can control test execution speed -- `pytest-testmon`_ - plugin for `Test Driven Development`_ which executes - tests that are affected by your code changes - -.. _pytest-django: https://github.com/pytest-dev/pytest-django -.. _django-test-migrations: https://github.com/wemake-services/django-test-migrations -.. _pytest-cov: https://github.com/pytest-dev/pytest-cov -.. _pytest-randomly: https://github.com/pytest-dev/pytest-randomly -.. _pytest-deadfixtures: https://github.com/jllorencetti/pytest-deadfixtures -.. _pytest-timeout: https://pypi.org/project/pytest-timeout -.. _pytest-testmon: https://github.com/tarpas/pytest-testmon -.. _`Test Driven Development`: https://en.wikipedia.org/wiki/Test-driven_development - -Tweaking tests performance -~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There are several options you can provide or remove to make your tests faster: - -- You can use ``pytest-xdist`` together with - ``-n auto`` to schedule several numbers of workers, - sometimes when there are a lot of tests it may increase the testing speed. - But on a small project with a small amount of test it just - gives you an overhead, so removing it (together with `--boxed`) - will boost your testing performance -- If there are a lot of tests with database access - it may be wise to add - `--reuse-db option `_, - so ``django`` won't recreate database on each test -- If there are a lot of migrations to perform you may also add - `--nomigrations option `_, - so ``django`` won't run all the migrations - and instead will inspect and create models directly -- Removing ``coverage``. Sometimes that an option. - When running tests in TDD style why would you need such a feature? - So, coverage will be calculated when you will ask for it. - That's a huge speed up -- Removing linters. Sometimes you may want to split linting and testing phases. - This might be useful when you have a lot of tests, and you want to run - linters before, so it won't fail your complex testing pyramid with a simple - whitespace violation - - -mypy ----- - -Running ``mypy`` is required before any commit: - -.. code:: bash - - mypy server tests/**/*.py - -This will eliminate a lot of possible ``TypeError`` and other issues -in both `server/` and `tests/` directories. -We use `tests/**/*.py` because `tests/` is not a python package, -so it is not importable. - -However, this will not make code 100% safe from errors. -So, both the testing and review process are still required. - -``mypy`` is configured via ``setup.cfg``. -Read the `docs `_ -for more information. - -We also use `django-stubs `_ -to type ``django`` internals. -This package is optional and can be removed, -if you don't want to type your ``django`` for some reason. diff --git a/new-github-repos/docs/pages/template/troubleshooting.rst b/new-github-repos/docs/pages/template/troubleshooting.rst deleted file mode 100644 index 0f5a294..0000000 --- a/new-github-repos/docs/pages/template/troubleshooting.rst +++ /dev/null @@ -1,47 +0,0 @@ -Troubleshooting -=============== - -This section is about some of the problems you may encounter and -how to solve these problems. - - -Docker ------- - -Pillow -~~~~~~ - -If you want to install ``Pillow`` that you should -add this to dockerfile and rebuild image: - -- ``RUN apk add jpeg-dev zlib-dev`` -- ``LIBRARY_PATH=/lib:/usr/lib /bin/sh -c "poetry install ..."`` - -See ``_ - -Root owns build artifacts -~~~~~~~~~~~~~~~~~~~~~~~~~ - -This happens on some systems. -It happens because build happens in ``docker`` as the ``root`` user. -The fix is to pass current ``UID`` to ``docker``. -See ``_. - -MacOS performance -~~~~~~~~~~~~~~~~~ - -If you use the MacOS you -know that you have problems with disk performance. -Starting and restarting an application is slower than with Linux -(it's very noticeable for project with large codebase). -For particular solve this problem add ``:delegated`` to each -your volumes in ``docker-compose.yml`` file. - -.. code:: yaml - - volumes: - - pgdata:/var/lib/postgresql/data:delegated - -For more information, you can look at the -`docker documents `_ -and a good `article `_. diff --git a/new-github-repos/docs/pages/template/upgrading-template.rst b/new-github-repos/docs/pages/template/upgrading-template.rst deleted file mode 100644 index 15230f3..0000000 --- a/new-github-repos/docs/pages/template/upgrading-template.rst +++ /dev/null @@ -1,51 +0,0 @@ -Upgrading template -================== - -Upgrading your project to be up-to-date with this template is a primary goal. -This is achieved by manually applying ``diff`` to your existing code. - -``diff`` can be viewed from the project's ``README.md``. -See `an example `_. - -When the upgrade is applied just change the commit hash in your template -to the most recent one. - - -Versions --------- - -Sometimes, when we break something heavily, we create a version. -That's is required for our users, so they can use old releases to create -projects as they used to be a long time ago. - -However, we do not officially support older versions. -And we do not recommend to use them. - -A full list of versions can be `found here `_. - - -Migration guides ----------------- - -Each time we create a new version, we also provide a migration guide. -What is a migration guide? -It is something you have to do to your project -other than just copy-pasting diffs from new versions. - -Goodbye, pipenv! -~~~~~~~~~~~~~~~~ - -This version requires a manual migration step. - -1. You need to install ``poetry`` -2. You need to create a new ``pyproject.toml`` file with ``poetry init`` -3. You need to adjust name, version, description, and authors meta fields -4. You need to copy-paste dependencies from ``Pipfile`` to ``pyproject.toml`` -5. You need to set correct version for each dependency in the list, - use ``"^x.y"`` `notation `_ -6. You need to adjust ``[build-system]`` tag and ``POETRY_VERSION`` variable - to fit your ``poetry`` version -7. Create ``poetry.lock`` file with ``poetry lock`` - -It should be fine! You may, however, experience some bugs related to different -dependency version resolution mechanisms. But, ``poetry`` does it better. diff --git a/new-github-repos/docs/requirements.txt b/new-github-repos/docs/requirements.txt deleted file mode 100644 index a07079a..0000000 --- a/new-github-repos/docs/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -# This file is required since we use ReadTheDocs services. -# If it is not used, feel free to delete it. - -sphinx==4.0.3 -sphinx_autodoc_typehints==1.12.0 -tomlkit==0.7.2 diff --git a/new-github-repos/locale/.gitkeep b/new-github-repos/locale/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/manage.py b/new-github-repos/manage.py deleted file mode 100755 index 4038558..0000000 --- a/new-github-repos/manage.py +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env python - -import os -import sys - - -def main() -> None: - """ - Main function. - - It does several things: - 1. Sets default settings module, if it is not set - 2. Warns if Django is not installed - 3. Executes any given command - """ - os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') - - try: - from django.core import management # noqa: WPS433 - except ImportError: - raise ImportError( - "Couldn't import Django. Are you sure it's installed and " + - 'available on your PYTHONPATH environment variable? Did you ' + - 'forget to activate a virtual environment?', - ) - - management.execute_from_command_line(sys.argv) - - -if __name__ == '__main__': - main() diff --git a/new-github-repos/poetry.lock b/new-github-repos/poetry.lock deleted file mode 100644 index fb8a0f1..0000000 --- a/new-github-repos/poetry.lock +++ /dev/null @@ -1,2719 +0,0 @@ -[[package]] -name = "alabaster" -version = "0.7.12" -description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "appnope" -version = "0.1.2" -description = "Disable App Nap on macOS >= 10.9" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "asgiref" -version = "3.4.1" -description = "ASGI specs, helper code, and adapters" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] - -[[package]] -name = "astor" -version = "0.8.1" -description = "Read/rewrite/write Python ASTs" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "autorepr" -version = "0.3.0" -description = "Makes civilized __repr__, __str__, and __unicode__ methods" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "babel" -version = "2.9.1" -description = "Internationalization utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pytz = ">=2015.7" - -[[package]] -name = "backcall" -version = "0.2.0" -description = "Specifications for callback functions passed in to an API" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "bandit" -version = "1.7.0" -description = "Security oriented static analyser for python code." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" -PyYAML = ">=5.3.1" -six = ">=1.10.0" -stevedore = ">=1.20.0" - -[[package]] -name = "bcrypt" -version = "3.2.0" -description = "Modern password hashing for your software and your servers" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.1" -six = ">=1.4.1" - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "blinker" -version = "1.4" -description = "Fast, simple object-to-object and broadcast signaling" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cachy" -version = "0.3.0" -description = "Cachy provides a simple yet effective caching library." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -redis = ["redis (>=3.3.6,<4.0.0)"] -memcached = ["python-memcached (>=1.59,<2.0)"] -msgpack = ["msgpack-python (>=0.5,<0.6)"] - -[[package]] -name = "certifi" -version = "2021.5.30" -description = "Python package for providing Mozilla's CA Bundle." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "cffi" -version = "1.14.5" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "chardet" -version = "4.0.0" -description = "Universal encoding detector for Python 2 and 3" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "click-default-group" -version = "1.2.2" -description = "Extends click.Group to invoke a command without explicit subcommand name" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -click = "*" - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "configupdater" -version = "2.0" -description = "Parser like ConfigParser but for updating configuration files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -testing = ["sphinx", "flake8", "pytest", "pytest-cov", "pytest-virtualenv", "pytest-xdist"] - -[[package]] -name = "coverage" -version = "5.5" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -toml = ["toml"] - -[[package]] -name = "darglint" -version = "1.8.0" -description = "A utility for ensuring Google-style docstrings stay up to date with the source code." -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "decorator" -version = "5.0.9" -description = "Decorators for Humans" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "dennis" -version = "0.9" -description = "Utilities for working with PO and POT files to ease development and improve localization quality" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -click = ">=6" -polib = ">=1.0.8" - -[[package]] -name = "dictdiffer" -version = "0.8.1" -description = "Dictdiffer is a library that helps you to diff and patch dictionaries." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -all = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)", "check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)", "numpy (>=1.11.0)"] -docs = ["Sphinx (>=1.4.4)", "sphinx-rtd-theme (>=0.1.9)"] -numpy = ["numpy (>=1.11.0)"] -tests = ["check-manifest (>=0.25)", "coverage (>=4.0)", "isort (>=4.2.2)", "mock (>=1.3.0)", "pydocstyle (>=1.0.0)", "pytest-cov (>=1.8.0)", "pytest-pep8 (>=1.0.6)", "pytest (>=2.8.0)", "tox (>=3.7.0)"] - -[[package]] -name = "django" -version = "3.2.5" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -asgiref = ">=3.3.2,<4" -pytz = "*" -sqlparse = ">=0.2.2" - -[package.extras] -argon2 = ["argon2-cffi (>=19.1.0)"] -bcrypt = ["bcrypt"] - -[[package]] -name = "django-axes" -version = "5.20.0" -description = "Keep track of failed login attempts in Django-powered sites." -category = "main" -optional = false -python-versions = "~=3.6" - -[package.dependencies] -django = ">=2.2" -django-ipware = ">=3,<4" - -[[package]] -name = "django-coverage-plugin" -version = "2.0.0" -description = "Django template coverage.py plugin" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -coverage = "*" -six = ">=1.4.0" - -[[package]] -name = "django-csp" -version = "3.7" -description = "Django Content Security Policy support." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -Django = ">=1.8" - -[package.extras] -jinja2 = ["jinja2 (>=2.9.6)"] -tests = ["pytest (<4.0)", "pytest-django", "pytest-flakes (==1.0.1)", "pytest-pep8 (==1.0.6)", "pep8 (==1.4.6)", "mock (==1.0.1)", "six (==1.12.0)", "jinja2 (>=2.9.6)"] - -[[package]] -name = "django-debug-toolbar" -version = "3.2.1" -description = "A configurable set of panels that display various debug information about the current request/response." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Django = ">=2.2" -sqlparse = ">=0.2.0" - -[[package]] -name = "django-extra-checks" -version = "0.11.0" -description = "Collection of useful checks for Django Checks Framework" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pytest (>=6,<7)", "pytest-cov (>=2,<3)", "pytest-django (>=4,<5)", "Django (>=3.1,<3.2)", "djangorestframework (>=3.12)", "django-stubs (==1.7.0)", "djangorestframework-stubs (==1.3.0)", "flake8 (==3.8.0)", "flake8-bugbear (==20.11.1)", "pre-commit (==2.9.3)", "isort (>=5,<6)", "pdbpp", "tox (>=3,<4)", "black (==20.8b1)"] - -[[package]] -name = "django-health-check" -version = "3.16.4" -description = "Run checks on services like databases, queue servers, celery processes, etc." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -django = ">=2.2" - -[[package]] -name = "django-http-referrer-policy" -version = "1.1.1" -description = "django-http-referrer-policy provides a middleware class implementing the Referrer-Policy header for Django-powered sites." -category = "main" -optional = false -python-versions = ">=3.5.0" - -[package.dependencies] -Django = ">=1.11" - -[[package]] -name = "django-ipware" -version = "3.0.2" -description = "A Django utility application that returns client's real IP address" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "django-migration-linter" -version = "3.0.0" -description = "Detect backward incompatible migrations for your django project" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -appdirs = ">=1.4.3" -django = ">=1.11" -six = ">=1.14.0" -toml = ">=0.10.2" - -[package.extras] -test = ["tox (>=3.15.2)", "mysqlclient (>=1.4.6)", "psycopg2-binary (>=2.8.5,<2.9)", "django-add-default-value (>=0.4.0)", "coverage (>=5.5)", "mock (>=3.0.5)", "backports.tempfile (>=1.0)"] - -[[package]] -name = "django-permissions-policy" -version = "4.1.0" -description = "Set the draft security HTTP header Permissions-Policy (previously Feature-Policy) on your Django app." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Django = ">=2.2" - -[[package]] -name = "django-querycount" -version = "0.7.0" -description = "Middleware that Prints the number of DB queries to the runserver console." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "django-split-settings" -version = "1.0.1" -description = "Organize Django settings into multiple files and directories. Easily override and modify settings. Use wildcards and optional settings files." -category = "main" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "django-stubs" -version = "1.8.0" -description = "Mypy stubs for Django" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -django = "*" -django-stubs-ext = "*" -mypy = ">=0.790" -typing-extensions = "*" - -[[package]] -name = "django-stubs-ext" -version = "0.2.0" -description = "Monkey-patching and extensions for django-stubs" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -django = "*" - -[[package]] -name = "django-test-migrations" -version = "1.1.0" -description = "Test django schema and data migrations, including ordering" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -typing_extensions = ">=3.7.4,<4.0.0" - -[[package]] -name = "doc8" -version = "0.8.1" -description = "Style checker for Sphinx (or other) RST documentation" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -chardet = "*" -docutils = "*" -Pygments = "*" -restructuredtext-lint = ">=0.7" -six = "*" -stevedore = "*" - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "docutils" -version = "0.17.1" -description = "Docutils -- Python Documentation Utilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "dotenv-linter" -version = "0.2.0" -description = "Linting dotenv files like a charm!" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -click = ">=6,<8" -click_default_group = ">=1.2,<2.0" -ply = ">=3.11,<4.0" -typing_extensions = ">=3.6,<4.0" - -[[package]] -name = "dparse" -version = "0.5.1" -description = "A parser for Python dependency files" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -packaging = "*" -pyyaml = "*" -toml = "*" - -[package.extras] -pipenv = ["pipenv"] - -[[package]] -name = "dump-env" -version = "1.3.0" -description = "A utility tool to create .env files" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "eradicate" -version = "2.0.0" -description = "Removes commented-out code." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "flake8" -version = "3.9.2" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.7.0,<2.8.0" -pyflakes = ">=2.3.0,<2.4.0" - -[[package]] -name = "flake8-bandit" -version = "2.1.2" -description = "Automated security testing with bandit and flake8." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -bandit = "*" -flake8 = "*" -flake8-polyfill = "*" -pycodestyle = "*" - -[[package]] -name = "flake8-broken-line" -version = "0.3.0" -description = "Flake8 plugin to forbid backslashes for line breaks" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -flake8 = ">=3.5,<4.0" - -[[package]] -name = "flake8-bugbear" -version = "21.4.3" -description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -attrs = ">=19.2.0" -flake8 = ">=3.0.0" - -[package.extras] -dev = ["coverage", "black", "hypothesis", "hypothesmith"] - -[[package]] -name = "flake8-commas" -version = "2.0.0" -description = "Flake8 lint for trailing commas." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = ">=2,<4.0.0" - -[[package]] -name = "flake8-comprehensions" -version = "3.5.0" -description = "A flake8 plugin to help you write better list/set/dict comprehensions." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -flake8 = ">=3.0,<3.2.0 || >3.2.0,<4" - -[[package]] -name = "flake8-debugger" -version = "4.0.0" -description = "ipdb/pdb statement checker plugin for flake8" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -flake8 = ">=3.0" -pycodestyle = "*" -six = "*" - -[[package]] -name = "flake8-django" -version = "1.1.2" -description = "Plugin to catch bad style specific to Django Projects." -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -flake8 = ">=3.8.4,<4.0.0" - -[[package]] -name = "flake8-docstrings" -version = "1.6.0" -description = "Extension for flake8 which uses pydocstyle to check docstrings" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = ">=3" -pydocstyle = ">=2.1" - -[[package]] -name = "flake8-eradicate" -version = "1.1.0" -description = "Flake8 plugin to find commented out code" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -attrs = "*" -eradicate = ">=2.0,<3.0" -flake8 = ">=3.5,<4.0" - -[[package]] -name = "flake8-isort" -version = "4.0.0" -description = "flake8 plugin that integrates isort ." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = ">=3.2.1,<4" -isort = ">=4.3.5,<6" -testfixtures = ">=6.8.0,<7" - -[package.extras] -test = ["pytest (>=4.0.2,<6)", "toml"] - -[[package]] -name = "flake8-logging-format" -version = "0.6.0" -description = "Flake8 extension to validate (lack of) logging format strings" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "flake8-plugin-utils" -version = "1.3.2" -description = "The package provides base classes and utils for flake8 plugin writing" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[[package]] -name = "flake8-polyfill" -version = "1.0.2" -description = "Polyfill package for Flake8 plugins" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = "*" - -[[package]] -name = "flake8-pytest-style" -version = "1.5.0" -description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -flake8-plugin-utils = ">=1.3.2,<2.0.0" - -[[package]] -name = "flake8-quotes" -version = "3.2.0" -description = "Flake8 lint for quotes." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = "*" - -[[package]] -name = "flake8-rst-docstrings" -version = "0.2.3" -description = "Python docstring reStructuredText (RST) validator" -category = "dev" -optional = false -python-versions = ">=3.3" - -[package.dependencies] -flake8 = ">=3.0.0" -pygments = "*" -restructuredtext-lint = "*" - -[[package]] -name = "flake8-string-format" -version = "0.3.0" -description = "string format checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8 = "*" - -[[package]] -name = "gitdb" -version = "4.0.7" -description = "Git Object Database" -category = "dev" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -smmap = ">=3.0.1,<5" - -[[package]] -name = "gitpython" -version = "3.1.18" -description = "Python Git Library" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -gitdb = ">=4.0.1,<5" - -[[package]] -name = "gunicorn" -version = "20.1.0" -description = "WSGI HTTP Server for UNIX" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.extras] -eventlet = ["eventlet (>=0.24.1)"] -gevent = ["gevent (>=1.4.0)"] -setproctitle = ["setproctitle"] -tornado = ["tornado (>=0.2)"] - -[[package]] -name = "hypothesis" -version = "6.14.1" -description = "A library for property-based testing" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -attrs = ">=19.2.0" -sortedcontainers = ">=2.1.0,<3.0.0" - -[package.extras] -all = ["black (>=19.10b0)", "click (>=7.0)", "django (>=2.2)", "dpcontracts (>=0.4)", "lark-parser (>=0.6.5)", "libcst (>=0.3.16)", "numpy (>=1.9.0)", "pandas (>=0.25)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "importlib-resources (>=3.3.0)", "importlib-metadata (>=3.6)", "backports.zoneinfo (>=0.2.1)", "tzdata (>=2020.4)"] -cli = ["click (>=7.0)", "black (>=19.10b0)", "rich (>=9.0.0)"] -codemods = ["libcst (>=0.3.16)"] -dateutil = ["python-dateutil (>=1.4)"] -django = ["pytz (>=2014.1)", "django (>=2.2)"] -dpcontracts = ["dpcontracts (>=0.4)"] -ghostwriter = ["black (>=19.10b0)"] -lark = ["lark-parser (>=0.6.5)"] -numpy = ["numpy (>=1.9.0)"] -pandas = ["pandas (>=0.25)"] -pytest = ["pytest (>=4.6)"] -pytz = ["pytz (>=2014.1)"] -redis = ["redis (>=3.0.0)"] -zoneinfo = ["importlib-resources (>=3.3.0)", "backports.zoneinfo (>=0.2.1)", "tzdata (>=2020.4)"] - -[[package]] -name = "identify" -version = "2.2.10" -description = "File identification library for Python" -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.extras] -license = ["editdistance-s"] - -[[package]] -name = "idna" -version = "2.10" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "imagesize" -version = "1.2.0" -description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "importlib-metadata" -version = "4.6.1" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -perf = ["ipython"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] - -[[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "ipython" -version = "7.25.0" -description = "IPython: Productive Interactive Computing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -appnope = {version = "*", markers = "sys_platform == \"darwin\""} -backcall = "*" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -decorator = "*" -jedi = ">=0.16" -matplotlib-inline = "*" -pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -traitlets = ">=4.2" - -[package.extras] -all = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.17)", "pygments", "qtconsole", "requests", "testpath"] -doc = ["Sphinx (>=1.3)"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.17)"] - -[[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "isort" -version = "5.9.1" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.6.1,<4.0" - -[package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] -colors = ["colorama (>=0.4.3,<0.5.0)"] -plugins = ["setuptools"] - -[[package]] -name = "jedi" -version = "0.18.0" -description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -parso = ">=0.8.0,<0.9.0" - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["Django (<3.1)", "colorama", "docopt", "pytest (<6.0.0)"] - -[[package]] -name = "jinja2" -version = "3.0.1" -description = "A very fast and expressive template engine." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jmespath" -version = "0.10.0" -description = "JSON Matching Expressions" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "loguru" -version = "0.5.3" -description = "Python logging made (stupidly) simple" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} -win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} - -[package.extras] -dev = ["codecov (>=2.0.15)", "colorama (>=0.3.4)", "flake8 (>=3.7.7)", "tox (>=3.9.0)", "tox-travis (>=0.12)", "pytest (>=4.6.2)", "pytest-cov (>=2.7.1)", "Sphinx (>=2.2.1)", "sphinx-autobuild (>=0.7.1)", "sphinx-rtd-theme (>=0.4.3)", "black (>=19.10b0)", "isort (>=5.1.1)"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "marshmallow" -version = "3.12.1" -description = "A lightweight library for converting complex datatypes to and from native Python datatypes." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["pytest", "pytz", "simplejson", "mypy (==0.812)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)", "tox"] -docs = ["sphinx (==4.0.0)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.4)"] -lint = ["mypy (==0.812)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)"] -tests = ["pytest", "pytz", "simplejson"] - -[[package]] -name = "marshmallow-polyfield" -version = "5.10" -description = "An unofficial extension to Marshmallow to allow for polymorphic fields" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -marshmallow = ">=3.0.0b10" - -[[package]] -name = "matplotlib-inline" -version = "0.1.2" -description = "Inline Matplotlib backend for Jupyter" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -traitlets = "*" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "more-itertools" -version = "8.8.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "mypy" -version = "0.910" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -toml = "*" -typing-extensions = ">=3.7.4" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<1.5.0)"] - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "nitpick" -version = "0.26.0" -description = "Enforce the same configuration across multiple projects" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -attrs = "*" -autorepr = "*" -cachy = "*" -click = "*" -ConfigUpdater = "*" -dictdiffer = "*" -flake8 = ">=3.0.0" -identify = "*" -jmespath = "*" -loguru = "*" -marshmallow = ">=3.0.0b10" -marshmallow-polyfield = ">=5.10,<6.0" -more-itertools = "*" -pluggy = "*" -pydantic = "*" -python-slugify = "*" -requests = "*" -"ruamel.yaml" = "*" -sortedcontainers = "*" -toml = "*" -tomlkit = "*" - -[package.extras] -test = ["freezegun", "pytest-cov", "pytest", "responses", "testfixtures"] -lint = ["pylint"] -doc = ["sphinx", "sphinx-rtd-theme", "sphobjinv"] - -[[package]] -name = "nplusone" -version = "1.0.0" -description = "Detecting the n+1 queries problem in Python" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -blinker = ">=1.3" -six = ">=1.9.0" - -[[package]] -name = "packaging" -version = "21.0" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "parso" -version = "0.8.2" -description = "A Python Parser" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] - -[[package]] -name = "pathspec" -version = "0.8.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pbr" -version = "5.6.0" -description = "Python Build Reasonableness" -category = "dev" -optional = false -python-versions = ">=2.6" - -[[package]] -name = "pep8-naming" -version = "0.11.1" -description = "Check PEP-8 naming conventions, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -flake8-polyfill = ">=1.0.2,<2" - -[[package]] -name = "pexpect" -version = "4.8.0" -description = "Pexpect allows easy control of interactive console applications." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -name = "pickleshare" -version = "0.7.5" -description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pluggy" -version = "0.13.1" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -name = "ply" -version = "3.11" -description = "Python Lex & Yacc" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "polib" -version = "1.1.1" -description = "A library to manipulate gettext files (po and mo files)." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "polint" -version = "0.4" -description = "Linter for gettext PO files" -category = "dev" -optional = false -python-versions = ">2.6,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.dependencies] -docopt = "*" -polib = "*" - -[package.extras] -quality = ["flake8", "isort", "pydocstyle"] -tests = ["mock"] - -[[package]] -name = "prompt-toolkit" -version = "3.0.19" -description = "Library for building powerful interactive command lines in Python" -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -wcwidth = "*" - -[[package]] -name = "psycopg2-binary" -version = "2.8.6" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" - -[[package]] -name = "ptyprocess" -version = "0.7.0" -description = "Run a subprocess in a pseudo terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "py" -version = "1.10.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycodestyle" -version = "2.7.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pycparser" -version = "2.20" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pydantic" -version = "1.8.2" -description = "Data validation and settings management using python 3.6 type hinting" -category = "dev" -optional = false -python-versions = ">=3.6.1" - -[package.dependencies] -typing-extensions = ">=3.7.4.3" - -[package.extras] -dotenv = ["python-dotenv (>=0.10.4)"] -email = ["email-validator (>=1.0.3)"] - -[[package]] -name = "pydocstyle" -version = "6.1.1" -description = "Python docstring style checker" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -snowballstemmer = "*" - -[package.extras] -toml = ["toml"] - -[[package]] -name = "pyflakes" -version = "2.3.1" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pygments" -version = "2.9.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pytest" -version = "6.2.4" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<1.0.0a1" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "2.12.1" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -coverage = ">=5.2.1" -pytest = ">=4.6" -toml = "*" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] - -[[package]] -name = "pytest-deadfixtures" -version = "2.2.1" -description = "A simple plugin to list unused fixtures in pytest" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pytest = ">=3.0.0" - -[[package]] -name = "pytest-django" -version = "4.4.0" -description = "A Django plugin for pytest." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -pytest = ">=5.4.0" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -testing = ["django", "django-configurations (>=2.0)"] - -[[package]] -name = "pytest-randomly" -version = "3.8.0" -description = "Pytest plugin to randomly order tests and control random.seed." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -pytest = "*" - -[[package]] -name = "pytest-testmon" -version = "1.1.1" -description = "selects tests affected by changed files and methods" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -coverage = ">=4,<6" -pytest = ">=5,<7" - -[[package]] -name = "pytest-timeout" -version = "1.4.2" -description = "py.test plugin to abort hanging tests" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pytest = ">=3.6.0" - -[[package]] -name = "python-decouple" -version = "3.4" -description = "Strict separation of settings from code." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "python-slugify" -version = "5.0.2" -description = "A Python Slugify application that handles Unicode" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -text-unidecode = ">=1.3" - -[package.extras] -unidecode = ["Unidecode (>=1.1.1)"] - -[[package]] -name = "pytz" -version = "2021.1" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyyaml" -version = "5.4.1" -description = "YAML parser and emitter for Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[[package]] -name = "requests" -version = "2.25.1" -description = "Python HTTP for Humans." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] - -[[package]] -name = "restructuredtext-lint" -version = "1.3.2" -description = "reStructuredText linter" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -docutils = ">=0.11,<1.0" - -[[package]] -name = "ruamel.yaml" -version = "0.17.10" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "dev" -optional = false -python-versions = ">=3" - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel.yaml.clib" -version = "0.2.6" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "safety" -version = "1.10.3" -description = "Checks installed dependencies for known vulnerabilities." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -Click = ">=6.0" -dparse = ">=0.5.1" -packaging = "*" -requests = "*" - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "smmap" -version = "4.0.0" -description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "snowballstemmer" -version = "2.1.0" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "sphinx" -version = "4.0.3" -description = "Python documentation generator" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -alabaster = ">=0.7,<0.8" -babel = ">=1.3" -colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} -docutils = ">=0.14,<0.18" -imagesize = "*" -Jinja2 = ">=2.3" -packaging = "*" -Pygments = ">=2.0" -requests = ">=2.5.0" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] -test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] - -[[package]] -name = "sphinx-autodoc-typehints" -version = "1.12.0" -description = "Type hints (PEP 484) support for the Sphinx autodoc extension" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Sphinx = ">=3.0" - -[package.extras] -test = ["pytest (>=3.1.0)", "typing-extensions (>=3.5)", "sphobjinv (>=2.0)", "Sphinx (>=3.2.0)", "dataclasses"] -type_comments = ["typed-ast (>=1.4.0)"] - -[[package]] -name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-devhelp" -version = "1.0.2" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-htmlhelp" -version = "2.0.0" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] - -[[package]] -name = "sphinxcontrib-jsmath" -version = "1.0.1" -description = "A sphinx extension which renders display math in HTML via JavaScript" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -name = "sphinxcontrib-qthelp" -version = "1.0.3" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sphinxcontrib-serializinghtml" -version = "1.1.5" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest"] - -[[package]] -name = "sqlparse" -version = "0.4.1" -description = "A non-validating SQL parser." -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "stevedore" -version = "3.3.0" -description = "Manage dynamic plugins for Python applications" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" - -[[package]] -name = "structlog" -version = "21.1.0" -description = "Structured Logging for Python" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest-asyncio", "pytest-randomly", "pytest (>=6.0)", "simplejson", "furo", "sphinx", "sphinx-toolbox", "twisted", "pre-commit"] -docs = ["furo", "sphinx", "sphinx-toolbox", "twisted"] -tests = ["coverage", "freezegun (>=0.2.8)", "pretend", "pytest-asyncio", "pytest-randomly", "pytest (>=6.0)", "simplejson"] - -[[package]] -name = "testfixtures" -version = "6.17.1" -description = "A collection of helpers and mock objects for unit tests and doc tests." -category = "dev" -optional = false -python-versions = "*" - -[package.extras] -build = ["setuptools-git", "wheel", "twine"] -docs = ["sphinx", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] -test = ["pytest (>=3.6)", "pytest-cov", "pytest-django", "zope.component", "sybil", "twisted", "mock", "django (<2)", "django"] - -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomlkit" -version = "0.7.2" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "traitlets" -version = "5.0.5" -description = "Traitlets Python configuration system" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -ipython-genutils = "*" - -[package.extras] -test = ["pytest"] - -[[package]] -name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "urllib3" -version = "1.26.6" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "wemake-python-styleguide" -version = "0.15.3" -description = "The strictest and most opinionated python linter ever" -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" - -[package.dependencies] -astor = ">=0.8,<0.9" -attrs = "*" -darglint = ">=1.2,<2.0" -flake8 = ">=3.7,<4.0" -flake8-bandit = ">=2.1,<3.0" -flake8-broken-line = ">=0.3,<0.4" -flake8-bugbear = ">=20.1,<22.0" -flake8-commas = ">=2.0,<3.0" -flake8-comprehensions = ">=3.1,<4.0" -flake8-debugger = ">=4.0,<5.0" -flake8-docstrings = ">=1.3,<2.0" -flake8-eradicate = ">=1.0,<2.0" -flake8-isort = ">=4.0,<5.0" -flake8-quotes = ">=3.0,<4.0" -flake8-rst-docstrings = ">=0.2.3,<0.3.0" -flake8-string-format = ">=0.3,<0.4" -pep8-naming = ">=0.11,<0.12" -pygments = ">=2.4,<3.0" -typing_extensions = ">=3.6,<4.0" - -[[package]] -name = "win32-setctime" -version = "1.0.3" -description = "A small Python utility to set file creation time on Windows" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.extras] -dev = ["pytest (>=4.6.2)", "black (>=19.3b0)"] - -[[package]] -name = "yamllint" -version = "1.26.1" -description = "A linter for YAML files." -category = "dev" -optional = false -python-versions = ">=3.5.*" - -[package.dependencies] -pathspec = ">=0.5.3" -pyyaml = "*" - -[[package]] -name = "zipp" -version = "3.5.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - -[metadata] -lock-version = "1.1" -python-versions = "3.8.9" -content-hash = "44d732e8d5e1308964707fbf89dfe49a552ab69c7e8e942dc10c17cf3d86c426" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -] -asgiref = [ - {file = "asgiref-3.4.1-py3-none-any.whl", hash = "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"}, - {file = "asgiref-3.4.1.tar.gz", hash = "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9"}, -] -astor = [ - {file = "astor-0.8.1-py2.py3-none-any.whl", hash = "sha256:070a54e890cefb5b3739d19f30f5a5ec840ffc9c50ffa7d23cc9fc1a38ebbfc5"}, - {file = "astor-0.8.1.tar.gz", hash = "sha256:6a6effda93f4e1ce9f618779b2dd1d9d84f1e32812c23a29b3fff6fd7f63fa5e"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -autorepr = [ - {file = "autorepr-0.3.0-py2-none-any.whl", hash = "sha256:c34567e4073630feb52d9c788fc198085e9e9de4817e3b93b7c4c534fc689f11"}, - {file = "autorepr-0.3.0-py2.py3-none-any.whl", hash = "sha256:1d9010d14fb325d3961e3aa73692685563f97d6ba4a2f0f735329fb37422599c"}, - {file = "autorepr-0.3.0.tar.gz", hash = "sha256:ef770b84793d5433e6bb893054973b8c7ce6b487274f9c3f734f678cae11e85e"}, -] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -backcall = [ - {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, - {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, -] -bandit = [ - {file = "bandit-1.7.0-py3-none-any.whl", hash = "sha256:216be4d044209fa06cf2a3e51b319769a51be8318140659719aa7a115c35ed07"}, - {file = "bandit-1.7.0.tar.gz", hash = "sha256:8a4c7415254d75df8ff3c3b15cfe9042ecee628a1e40b44c15a98890fbfc2608"}, -] -bcrypt = [ - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, - {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, - {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, - {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, -] -blinker = [ - {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, -] -cachy = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] -certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, -] -cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24ec4ff2c5c0c8f9c6b87d5bb53555bf267e1e6f70e52e5a9740d32861d36b6f"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3c3f39fa737542161d8b0d680df2ec249334cd70a8f420f71c9304bd83c3cbed"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:681d07b0d1e3c462dd15585ef5e33cb021321588bebd910124ef4f4fb71aef55"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06d7cd1abac2ffd92e65c0609661866709b4b2d82dd15f611e602b9b188b0b69"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0f861a89e0043afec2a51fd177a567005847973be86f709bbb044d7f42fc4e05"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc5a8e069b9ebfa22e26d0e6b97d6f9781302fe7f4f2b8776c3e1daea35f1adc"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04c468b622ed31d408fea2346bec5bbffba2cc44226302a0de1ade9f5ea3d373"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:06db6321b7a68b2bd6df96d08a5adadc1fa0e8f419226e25b2a5fbf6ccc7350f"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:293e7ea41280cb28c6fcaaa0b1aa1f533b8ce060b9e701d78511e1e6c4a1de76"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bf1ac1984eaa7675ca8d5745a8cb87ef7abecb5592178406e55858d411eadc0"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df5052c5d867c1ea0b311fb7c3cd28b19df469c056f7fdcfe88c7473aa63e333"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24a570cd11895b60829e941f2613a4f79df1a27344cbbb82164ef2e0116f09c7"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -click-default-group = [ - {file = "click-default-group-1.2.2.tar.gz", hash = "sha256:d9560e8e8dfa44b3562fbc9425042a0fd6d21956fcc2db0077f63f34253ab904"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -configupdater = [ - {file = "ConfigUpdater-2.0-py2.py3-none-any.whl", hash = "sha256:bc62bd5141c45a89840a3e82e0a06f23fb2c00de82e2b72c8030cafb4daea9a2"}, - {file = "ConfigUpdater-2.0.tar.gz", hash = "sha256:6a60447fb25e5cb5036cdd5761287ac5649135a49094bc8bd71d999417483441"}, -] -coverage = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, -] -darglint = [ - {file = "darglint-1.8.0-py3-none-any.whl", hash = "sha256:ac6797bcc918cd8d8f14c168a4a364f54e1aeb4ced59db58e7e4c6dfec2fe15c"}, - {file = "darglint-1.8.0.tar.gz", hash = "sha256:aa605ef47817a6d14797d32b390466edab621768ea4ca5cc0f3c54f6d8dcaec8"}, -] -decorator = [ - {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"}, - {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"}, -] -dennis = [ - {file = "dennis-0.9-py2.py3-none-any.whl", hash = "sha256:f6487392ac91800c5f0684a99b404b7fd0f72ceb48faeb5a0ce4e2c24fb62d3f"}, - {file = "dennis-0.9.tar.gz", hash = "sha256:8c942dd5da7d03c65daebc069c5ee5c7f1374ac9b0c8c89c627caa66fe822604"}, -] -dictdiffer = [ - {file = "dictdiffer-0.8.1-py2.py3-none-any.whl", hash = "sha256:d79d9a39e459fe33497c858470ca0d2e93cb96621751de06d631856adfd9c390"}, - {file = "dictdiffer-0.8.1.tar.gz", hash = "sha256:1adec0d67cdf6166bda96ae2934ddb5e54433998ceab63c984574d187cc563d2"}, -] -django = [ - {file = "Django-3.2.5-py3-none-any.whl", hash = "sha256:c58b5f19c5ae0afe6d75cbdd7df561e6eb929339985dbbda2565e1cabb19a62e"}, - {file = "Django-3.2.5.tar.gz", hash = "sha256:3da05fea54fdec2315b54a563d5b59f3b4e2b1e69c3a5841dda35019c01855cd"}, -] -django-axes = [ - {file = "django-axes-5.20.0.tar.gz", hash = "sha256:fe2c36a2252e1936e901d87bf49249aa8ac33655dd47c4083ba5ff56512cc247"}, - {file = "django_axes-5.20.0-py3-none-any.whl", hash = "sha256:7128589d9002216f5131be2581c4ef9c2039d59624406e2dcad2624bff850304"}, -] -django-coverage-plugin = [ - {file = "django_coverage_plugin-2.0.0.tar.gz", hash = "sha256:5a7ac412528876563a45f9b54ad9962e33e5f95b409843c4c6c92cb0247eee66"}, -] -django-csp = [ - {file = "django_csp-3.7-py2.py3-none-any.whl", hash = "sha256:01443a07723f9a479d498bd7bb63571aaa771e690f64bde515db6cdb76e8041a"}, - {file = "django_csp-3.7.tar.gz", hash = "sha256:01eda02ad3f10261c74131cdc0b5a6a62b7c7ad4fd017fbefb7a14776e0a9727"}, -] -django-debug-toolbar = [ - {file = "django-debug-toolbar-3.2.1.tar.gz", hash = "sha256:a5ff2a54f24bf88286f9872836081078f4baa843dc3735ee88524e89f8821e33"}, - {file = "django_debug_toolbar-3.2.1-py3-none-any.whl", hash = "sha256:e759e63e3fe2d3110e0e519639c166816368701eab4a47fed75d7de7018467b9"}, -] -django-extra-checks = [ - {file = "django-extra-checks-0.11.0.tar.gz", hash = "sha256:61681433f2df8b8932676c216472b7f5554bda0018058d0a0bac89bf377347bd"}, - {file = "django_extra_checks-0.11.0-py3-none-any.whl", hash = "sha256:b1a19c03243d67c380c8af60c1ef837323c21e2fd888e0fd532d1df5f1866ba0"}, -] -django-health-check = [ - {file = "django-health-check-3.16.4.tar.gz", hash = "sha256:334bcbbb9273a6dbd9c928e78474306e623dfb38cc442281cb9fd230a20a7fdb"}, - {file = "django_health_check-3.16.4-py2.py3-none-any.whl", hash = "sha256:86a8869d67e72394a1dd73e37819a7d2cfd915588b96927fda611d7451fd4735"}, -] -django-http-referrer-policy = [ - {file = "django-http-referrer-policy-1.1.1.tar.gz", hash = "sha256:917f5ed62054b27eff3172b7eccfb018469e85ddd538767328553282a70493c3"}, - {file = "django_http_referrer_policy-1.1.1-py2.py3-none-any.whl", hash = "sha256:7617d1256f1ab80c1a12bffdd8c8d24b94093eb1e21d035e2aa6d7d3c5ac999e"}, -] -django-ipware = [ - {file = "django-ipware-3.0.2.tar.gz", hash = "sha256:c7df8e1410a8e5d6b1fbae58728402ea59950f043c3582e033e866f0f0cf5e94"}, -] -django-migration-linter = [ - {file = "django-migration-linter-3.0.0.tar.gz", hash = "sha256:a45d955bbd01fff57d19978cd7e99599e7592fb94c27032edfd026ef51e45a05"}, - {file = "django_migration_linter-3.0.0-py2.py3-none-any.whl", hash = "sha256:beb62cf9777b6e3a9d902726fd5e514f73edae3398e1e948c5497c34315c87ad"}, -] -django-permissions-policy = [ - {file = "django-permissions-policy-4.1.0.tar.gz", hash = "sha256:30df0dfe6579f60743d181378c7cbbb44526a5df469aa633251234387d3819f1"}, - {file = "django_permissions_policy-4.1.0-py3-none-any.whl", hash = "sha256:774ca81646c84793c8c5645e581ecd4d08a88d492cf90c8983648d8fddcbb3c8"}, -] -django-querycount = [ - {file = "django-querycount-0.7.0.tar.gz", hash = "sha256:8f5123d78716ff0704f2373e746a7200b8d8417798ce4a99bf2de87e3768f9ce"}, -] -django-split-settings = [ - {file = "django-split-settings-1.0.1.tar.gz", hash = "sha256:2da16cd967cd38315ec7ff0ae0c9db8488f8528bb2e5de26cd898328dc4bbeac"}, - {file = "django_split_settings-1.0.1-py3-none-any.whl", hash = "sha256:8d636649023289d0ef0ba08b0a4f37761adc94a29ee0ebfe65922c3cb0594ede"}, -] -django-stubs = [ - {file = "django-stubs-1.8.0.tar.gz", hash = "sha256:717967d7fee0a6af0746724a0be80d72831a982a40fa8f245a6a46f4cafd157b"}, - {file = "django_stubs-1.8.0-py3-none-any.whl", hash = "sha256:bde9e44e3c4574c2454e74a3e607cc3bc23b0441bb7d1312cd677d5e30984b74"}, -] -django-stubs-ext = [ - {file = "django-stubs-ext-0.2.0.tar.gz", hash = "sha256:c14f297835a42c1122421ec7e2d06579996b29d33b8016002762afa5d78863af"}, - {file = "django_stubs_ext-0.2.0-py3-none-any.whl", hash = "sha256:bd4a1e36ef2ba0ef15801933c85c68e59b383302c873795c6ecfc25950c7ecdb"}, -] -django-test-migrations = [ - {file = "django-test-migrations-1.1.0.tar.gz", hash = "sha256:27c0127552920bbdc339a84de360f1792abc8c353e2c8d2b86af92dc1ade6703"}, - {file = "django_test_migrations-1.1.0-py3-none-any.whl", hash = "sha256:7ea17dac1a0b0c8084681899c6563d85f4262832f2fbb0c6240b12e554333934"}, -] -doc8 = [ - {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, - {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] -dotenv-linter = [ - {file = "dotenv-linter-0.2.0.tar.gz", hash = "sha256:c99b981966450e48007b92547ed8e16355ec88f1dac5494a4576440546467cf7"}, - {file = "dotenv_linter-0.2.0-py3-none-any.whl", hash = "sha256:536992ef6f6bf803e58e2984cf428486491059ca750b13bd9eb6b5186110709a"}, -] -dparse = [ - {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, - {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, -] -dump-env = [ - {file = "dump-env-1.3.0.tar.gz", hash = "sha256:6c2874c7f30c7cea945f3438e37e67e081644bd6c5383189613e5fc31c277837"}, - {file = "dump_env-1.3.0-py3-none-any.whl", hash = "sha256:c2f3bdda16f0dbb79fca0b22f8df763cff4009d311342c73ce36bcd1ad8b007c"}, -] -eradicate = [ - {file = "eradicate-2.0.0.tar.gz", hash = "sha256:27434596f2c5314cc9b31410c93d8f7e8885747399773cd088d3adea647a60c8"}, -] -flake8 = [ - {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, - {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, -] -flake8-bandit = [ - {file = "flake8_bandit-2.1.2.tar.gz", hash = "sha256:687fc8da2e4a239b206af2e54a90093572a60d0954f3054e23690739b0b0de3b"}, -] -flake8-broken-line = [ - {file = "flake8-broken-line-0.3.0.tar.gz", hash = "sha256:f74e052833324a9e5f0055032f7ccc54b23faabafe5a26241c2f977e70b10b50"}, - {file = "flake8_broken_line-0.3.0-py3-none-any.whl", hash = "sha256:611f79c7f27118e7e5d3dc098ef7681c40aeadf23783700c5dbee840d2baf3af"}, -] -flake8-bugbear = [ - {file = "flake8-bugbear-21.4.3.tar.gz", hash = "sha256:2346c81f889955b39e4a368eb7d508de723d9de05716c287dc860a4073dc57e7"}, - {file = "flake8_bugbear-21.4.3-py36.py37.py38-none-any.whl", hash = "sha256:4f305dca96be62bf732a218fe6f1825472a621d3452c5b994d8f89dae21dbafa"}, -] -flake8-commas = [ - {file = "flake8-commas-2.0.0.tar.gz", hash = "sha256:d3005899466f51380387df7151fb59afec666a0f4f4a2c6a8995b975de0f44b7"}, - {file = "flake8_commas-2.0.0-py2.py3-none-any.whl", hash = "sha256:ee2141a3495ef9789a3894ed8802d03eff1eaaf98ce6d8653a7c573ef101935e"}, -] -flake8-comprehensions = [ - {file = "flake8-comprehensions-3.5.0.tar.gz", hash = "sha256:f24be9032587127f7a5bc6d066bf755b6e66834f694383adb8a673e229c1f559"}, - {file = "flake8_comprehensions-3.5.0-py3-none-any.whl", hash = "sha256:b07aef3277623db32310aa241a1cec67212b53c1d18e767d7e26d4d83aa05bf7"}, -] -flake8-debugger = [ - {file = "flake8-debugger-4.0.0.tar.gz", hash = "sha256:e43dc777f7db1481db473210101ec2df2bd39a45b149d7218a618e954177eda6"}, - {file = "flake8_debugger-4.0.0-py3-none-any.whl", hash = "sha256:82e64faa72e18d1bdd0000407502ebb8ecffa7bc027c62b9d4110ce27c091032"}, -] -flake8-django = [ - {file = "flake8-django-1.1.2.tar.gz", hash = "sha256:b4314abb5bacda450d2eae564a0604447111b1b98188e46bca41682ad2ab59d6"}, - {file = "flake8_django-1.1.2-py3-none-any.whl", hash = "sha256:f8bfdbe8352c2c5f3788c2a2f6652dd2604af24af07a5aa112206d63ae228fdc"}, -] -flake8-docstrings = [ - {file = "flake8-docstrings-1.6.0.tar.gz", hash = "sha256:9fe7c6a306064af8e62a055c2f61e9eb1da55f84bb39caef2b84ce53708ac34b"}, - {file = "flake8_docstrings-1.6.0-py2.py3-none-any.whl", hash = "sha256:99cac583d6c7e32dd28bbfbef120a7c0d1b6dde4adb5a9fd441c4227a6534bde"}, -] -flake8-eradicate = [ - {file = "flake8-eradicate-1.1.0.tar.gz", hash = "sha256:f5917d6dbca352efcd10c15fdab9c55c48f0f26f6a8d47898b25d39101f170a8"}, - {file = "flake8_eradicate-1.1.0-py3-none-any.whl", hash = "sha256:d8e39b684a37c257a53cda817d86e2d96c9ba3450ddc292742623a5dfee04d9e"}, -] -flake8-isort = [ - {file = "flake8-isort-4.0.0.tar.gz", hash = "sha256:2b91300f4f1926b396c2c90185844eb1a3d5ec39ea6138832d119da0a208f4d9"}, - {file = "flake8_isort-4.0.0-py2.py3-none-any.whl", hash = "sha256:729cd6ef9ba3659512dee337687c05d79c78e1215fdf921ed67e5fe46cce2f3c"}, -] -flake8-logging-format = [ - {file = "flake8-logging-format-0.6.0.tar.gz", hash = "sha256:ca5f2b7fc31c3474a0aa77d227e022890f641a025f0ba664418797d979a779f8"}, -] -flake8-plugin-utils = [ - {file = "flake8-plugin-utils-1.3.2.tar.gz", hash = "sha256:20fa2a8ca2decac50116edb42e6af0a1253ef639ad79941249b840531889c65a"}, - {file = "flake8_plugin_utils-1.3.2-py3-none-any.whl", hash = "sha256:1fe43e3e9acf3a7c0f6b88f5338cad37044d2f156c43cb6b080b5f9da8a76f06"}, -] -flake8-polyfill = [ - {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"}, - {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, -] -flake8-pytest-style = [ - {file = "flake8-pytest-style-1.5.0.tar.gz", hash = "sha256:668ce8f55edf7db4ac386d2735c3b354b5cb47aa341a4655d91a5788dd03124b"}, - {file = "flake8_pytest_style-1.5.0-py3-none-any.whl", hash = "sha256:ec287a7dc4fe95082af5e408c8b2f8f4b6bcb366d5a17ff6c34112eb03446580"}, -] -flake8-quotes = [ - {file = "flake8-quotes-3.2.0.tar.gz", hash = "sha256:3f1116e985ef437c130431ac92f9b3155f8f652fda7405ac22ffdfd7a9d1055e"}, -] -flake8-rst-docstrings = [ - {file = "flake8-rst-docstrings-0.2.3.tar.gz", hash = "sha256:3045794e1c8467fba33aaea5c246b8369efc9c44ef8b0b20199bb6df7a4bd47b"}, - {file = "flake8_rst_docstrings-0.2.3-py3-none-any.whl", hash = "sha256:565bbb391d7e4d0042924102221e9857ad72929cdd305b26501736ec22c1451a"}, -] -flake8-string-format = [ - {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"}, - {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"}, -] -gitdb = [ - {file = "gitdb-4.0.7-py3-none-any.whl", hash = "sha256:6c4cc71933456991da20917998acbe6cf4fb41eeaab7d6d67fbc05ecd4c865b0"}, - {file = "gitdb-4.0.7.tar.gz", hash = "sha256:96bf5c08b157a666fec41129e6d327235284cca4c81e92109260f353ba138005"}, -] -gitpython = [ - {file = "GitPython-3.1.18-py3-none-any.whl", hash = "sha256:fce760879cd2aebd2991b3542876dc5c4a909b30c9d69dfc488e504a8db37ee8"}, - {file = "GitPython-3.1.18.tar.gz", hash = "sha256:b838a895977b45ab6f0cc926a9045c8d1c44e2b653c1fcc39fe91f42c6e8f05b"}, -] -gunicorn = [ - {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, - {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, -] -hypothesis = [ - {file = "hypothesis-6.14.1-py3-none-any.whl", hash = "sha256:6dad44da8962cc7c13cdc28cf9b78c6779b5a0b0279a9baac427ae6d109f70e3"}, - {file = "hypothesis-6.14.1.tar.gz", hash = "sha256:88b0736a5691b68b8e16a4b7ee8e4c8596810c5a20989ea5b5f64870a7c25740"}, -] -identify = [ - {file = "identify-2.2.10-py2.py3-none-any.whl", hash = "sha256:18d0c531ee3dbc112fa6181f34faa179de3f57ea57ae2899754f16a7e0ff6421"}, - {file = "identify-2.2.10.tar.gz", hash = "sha256:5b41f71471bc738e7b586308c3fca172f78940195cb3bf6734c1e66fdac49306"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, - {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipython = [ - {file = "ipython-7.25.0-py3-none-any.whl", hash = "sha256:aa21412f2b04ad1a652e30564fff6b4de04726ce875eab222c8430edc6db383a"}, - {file = "ipython-7.25.0.tar.gz", hash = "sha256:54bbd1fe3882457aaf28ae060a5ccdef97f212a741754e420028d4ec5c2291dc"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -isort = [ - {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, - {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, -] -jedi = [ - {file = "jedi-0.18.0-py2.py3-none-any.whl", hash = "sha256:18456d83f65f400ab0c2d3319e48520420ef43b23a086fdc05dff34132f0fb93"}, - {file = "jedi-0.18.0.tar.gz", hash = "sha256:92550a404bad8afed881a137ec9a461fed49eca661414be45059329614ed0707"}, -] -jinja2 = [ - {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, - {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, -] -jmespath = [ - {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, - {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, -] -loguru = [ - {file = "loguru-0.5.3-py3-none-any.whl", hash = "sha256:f8087ac396b5ee5f67c963b495d615ebbceac2796379599820e324419d53667c"}, - {file = "loguru-0.5.3.tar.gz", hash = "sha256:b28e72ac7a98be3d28ad28570299a393dfcd32e5e3f6a353dec94675767b6319"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -marshmallow = [ - {file = "marshmallow-3.12.1-py2.py3-none-any.whl", hash = "sha256:b45cde981d1835145257b4a3c5cb7b80786dcf5f50dd2990749a50c16cb48e01"}, - {file = "marshmallow-3.12.1.tar.gz", hash = "sha256:8050475b70470cc58f4441ee92375db611792ba39ca1ad41d39cad193ea9e040"}, -] -marshmallow-polyfield = [ - {file = "marshmallow-polyfield-5.10.tar.gz", hash = "sha256:75d0e31b725650e91428f975a66ed30f703cc6f9fcfe45b8436ee6d676921691"}, - {file = "marshmallow_polyfield-5.10-py3-none-any.whl", hash = "sha256:a0a91730c6d21bfac1563990c7ba1413928e7499af669619d4fb38d1fb25c4e9"}, -] -matplotlib-inline = [ - {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"}, - {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"}, -] -mccabe = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] -more-itertools = [ - {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, - {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, -] -mypy = [ - {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, - {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, - {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, - {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, - {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, - {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, - {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, - {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, - {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, - {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, - {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, - {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, - {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, - {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, - {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, - {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, - {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, - {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, - {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, - {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, - {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, - {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, - {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -nitpick = [ - {file = "nitpick-0.26.0-py3-none-any.whl", hash = "sha256:f5cfcd68f83910ce8a4cd998804a4e15dfd5a9a54a3cb4e201f1ec4bee67fe89"}, - {file = "nitpick-0.26.0.tar.gz", hash = "sha256:b11009c77975990d7776ea6d307ed4272f5122e83b2fc16a6bad557222b6d809"}, -] -nplusone = [ - {file = "nplusone-1.0.0-py2.py3-none-any.whl", hash = "sha256:96b1e6e29e6af3e71b67d0cc012a5ec8c97c6a2f5399f4ba41a2bbe0e253a9ac"}, - {file = "nplusone-1.0.0.tar.gz", hash = "sha256:1726c0a10c0aa7eabb04e24db2882ff97b6b7ee29d729a8d97dcbd12ef5a5651"}, -] -packaging = [ - {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, - {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, -] -parso = [ - {file = "parso-0.8.2-py2.py3-none-any.whl", hash = "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22"}, - {file = "parso-0.8.2.tar.gz", hash = "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pbr = [ - {file = "pbr-5.6.0-py2.py3-none-any.whl", hash = "sha256:c68c661ac5cc81058ac94247278eeda6d2e6aecb3e227b0387c30d277e7ef8d4"}, - {file = "pbr-5.6.0.tar.gz", hash = "sha256:42df03e7797b796625b1029c0400279c7c34fd7df24a7d7818a1abb5b38710dd"}, -] -pep8-naming = [ - {file = "pep8-naming-0.11.1.tar.gz", hash = "sha256:a1dd47dd243adfe8a83616e27cf03164960b507530f155db94e10b36a6cd6724"}, - {file = "pep8_naming-0.11.1-py2.py3-none-any.whl", hash = "sha256:f43bfe3eea7e0d73e8b5d07d6407ab47f2476ccaeff6937c84275cd30b016738"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pickleshare = [ - {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -ply = [ - {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, - {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, -] -polib = [ - {file = "polib-1.1.1-py2.py3-none-any.whl", hash = "sha256:d3ee85e0c6788f789353416b1612c6c92d75fe6ccfac0029711974d6abd0f86d"}, - {file = "polib-1.1.1.tar.gz", hash = "sha256:e02c355ae5e054912e3b0d16febc56510eff7e49d60bf22aecb463bd2f2a2dfa"}, -] -polint = [ - {file = "polint-0.4.tar.gz", hash = "sha256:51b68a8719aaa141a288718e950d5f5c529d6b8efbfd6e3e35ab951092a91edd"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.19-py3-none-any.whl", hash = "sha256:7089d8d2938043508aa9420ec18ce0922885304cddae87fb96eebca942299f88"}, - {file = "prompt_toolkit-3.0.19.tar.gz", hash = "sha256:08360ee3a3148bdb5163621709ee322ec34fc4375099afa4bbf751e9b7b7fa4f"}, -] -psycopg2-binary = [ - {file = "psycopg2-binary-2.8.6.tar.gz", hash = "sha256:11b9c0ebce097180129e422379b824ae21c8f2a6596b159c7659e2e5a00e1aa0"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d14b140a4439d816e3b1229a4a525df917d6ea22a0771a2a78332273fd9528a4"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1fabed9ea2acc4efe4671b92c669a213db744d2af8a9fc5d69a8e9bc14b7a9db"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f5ab93a2cb2d8338b1674be43b442a7f544a0971da062a5da774ed40587f18f5"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27m-win32.whl", hash = "sha256:b4afc542c0ac0db720cf516dd20c0846f71c248d2b3d21013aa0d4ef9c71ca25"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27m-win_amd64.whl", hash = "sha256:e74a55f6bad0e7d3968399deb50f61f4db1926acf4a6d83beaaa7df986f48b1c"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0deac2af1a587ae12836aa07970f5cb91964f05a7c6cdb69d8425ff4c15d4e2c"}, - {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad20d2eb875aaa1ea6d0f2916949f5c08a19c74d05b16ce6ebf6d24f2c9f75d1"}, - {file = "psycopg2_binary-2.8.6-cp34-cp34m-win32.whl", hash = "sha256:950bc22bb56ee6ff142a2cb9ee980b571dd0912b0334aa3fe0fe3788d860bea2"}, - {file = "psycopg2_binary-2.8.6-cp34-cp34m-win_amd64.whl", hash = "sha256:b8a3715b3c4e604bcc94c90a825cd7f5635417453b253499664f784fc4da0152"}, - {file = "psycopg2_binary-2.8.6-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d1b4ab59e02d9008efe10ceabd0b31e79519da6fb67f7d8e8977118832d0f449"}, - {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ac0c682111fbf404525dfc0f18a8b5f11be52657d4f96e9fcb75daf4f3984859"}, - {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7d92a09b788cbb1aec325af5fcba9fed7203897bbd9269d5691bb1e3bce29550"}, - {file = "psycopg2_binary-2.8.6-cp35-cp35m-win32.whl", hash = "sha256:aaa4213c862f0ef00022751161df35804127b78adf4a2755b9f991a507e425fd"}, - {file = "psycopg2_binary-2.8.6-cp35-cp35m-win_amd64.whl", hash = "sha256:c2507d796fca339c8fb03216364cca68d87e037c1f774977c8fc377627d01c71"}, - {file = "psycopg2_binary-2.8.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ee69dad2c7155756ad114c02db06002f4cded41132cc51378e57aad79cc8e4f4"}, - {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e82aba2188b9ba309fd8e271702bd0d0fc9148ae3150532bbb474f4590039ffb"}, - {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d5227b229005a696cc67676e24c214740efd90b148de5733419ac9aaba3773da"}, - {file = "psycopg2_binary-2.8.6-cp36-cp36m-win32.whl", hash = "sha256:a0eb43a07386c3f1f1ebb4dc7aafb13f67188eab896e7397aa1ee95a9c884eb2"}, - {file = "psycopg2_binary-2.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:e1f57aa70d3f7cc6947fd88636a481638263ba04a742b4a37dd25c373e41491a"}, - {file = "psycopg2_binary-2.8.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:833709a5c66ca52f1d21d41865a637223b368c0ee76ea54ca5bad6f2526c7679"}, - {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ba28584e6bca48c59eecbf7efb1576ca214b47f05194646b081717fa628dfddf"}, - {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6a32f3a4cb2f6e1a0b15215f448e8ce2da192fd4ff35084d80d5e39da683e79b"}, - {file = "psycopg2_binary-2.8.6-cp37-cp37m-win32.whl", hash = "sha256:0e4dc3d5996760104746e6cfcdb519d9d2cd27c738296525d5867ea695774e67"}, - {file = "psycopg2_binary-2.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:cec7e622ebc545dbb4564e483dd20e4e404da17ae07e06f3e780b2dacd5cee66"}, - {file = "psycopg2_binary-2.8.6-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ba381aec3a5dc29634f20692349d73f2d21f17653bda1decf0b52b11d694541f"}, - {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a0c50db33c32594305b0ef9abc0cb7db13de7621d2cadf8392a1d9b3c437ef77"}, - {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dac98e85565d5688e8ab7bdea5446674a83a3945a8f416ad0110018d1501b94"}, - {file = "psycopg2_binary-2.8.6-cp38-cp38-win32.whl", hash = "sha256:bd1be66dde2b82f80afb9459fc618216753f67109b859a361cf7def5c7968729"}, - {file = "psycopg2_binary-2.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:8cd0fb36c7412996859cb4606a35969dd01f4ea34d9812a141cd920c3b18be77"}, - {file = "psycopg2_binary-2.8.6-cp39-cp39-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:89705f45ce07b2dfa806ee84439ec67c5d9a0ef20154e0e475e2b2ed392a5b83"}, - {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:42ec1035841b389e8cc3692277a0bd81cdfe0b65d575a2c8862cec7a80e62e52"}, - {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7312e931b90fe14f925729cde58022f5d034241918a5c4f9797cac62f6b3a9dd"}, - {file = "psycopg2_binary-2.8.6-cp39-cp39-win32.whl", hash = "sha256:6422f2ff0919fd720195f64ffd8f924c1395d30f9a495f31e2392c2efafb5056"}, - {file = "psycopg2_binary-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:15978a1fbd225583dd8cdaf37e67ccc278b5abecb4caf6b2d6b8e2b948e953f6"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -pycodestyle = [ - {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, - {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pydantic = [ - {file = "pydantic-1.8.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:05ddfd37c1720c392f4e0d43c484217b7521558302e7069ce8d318438d297739"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a7c6002203fe2c5a1b5cbb141bb85060cbff88c2d78eccbc72d97eb7022c43e4"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:589eb6cd6361e8ac341db97602eb7f354551482368a37f4fd086c0733548308e"}, - {file = "pydantic-1.8.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:10e5622224245941efc193ad1d159887872776df7a8fd592ed746aa25d071840"}, - {file = "pydantic-1.8.2-cp36-cp36m-win_amd64.whl", hash = "sha256:99a9fc39470010c45c161a1dc584997f1feb13f689ecf645f59bb4ba623e586b"}, - {file = "pydantic-1.8.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a83db7205f60c6a86f2c44a61791d993dff4b73135df1973ecd9eed5ea0bda20"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:41b542c0b3c42dc17da70554bc6f38cbc30d7066d2c2815a94499b5684582ecb"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:ea5cb40a3b23b3265f6325727ddfc45141b08ed665458be8c6285e7b85bd73a1"}, - {file = "pydantic-1.8.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:18b5ea242dd3e62dbf89b2b0ec9ba6c7b5abaf6af85b95a97b00279f65845a23"}, - {file = "pydantic-1.8.2-cp37-cp37m-win_amd64.whl", hash = "sha256:234a6c19f1c14e25e362cb05c68afb7f183eb931dd3cd4605eafff055ebbf287"}, - {file = "pydantic-1.8.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:021ea0e4133e8c824775a0cfe098677acf6fa5a3cbf9206a376eed3fc09302cd"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e710876437bc07bd414ff453ac8ec63d219e7690128d925c6e82889d674bb505"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:ac8eed4ca3bd3aadc58a13c2aa93cd8a884bcf21cb019f8cfecaae3b6ce3746e"}, - {file = "pydantic-1.8.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:4a03cbbe743e9c7247ceae6f0d8898f7a64bb65800a45cbdc52d65e370570820"}, - {file = "pydantic-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:8621559dcf5afacf0069ed194278f35c255dc1a1385c28b32dd6c110fd6531b3"}, - {file = "pydantic-1.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8b223557f9510cf0bfd8b01316bf6dd281cf41826607eada99662f5e4963f316"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:244ad78eeb388a43b0c927e74d3af78008e944074b7d0f4f696ddd5b2af43c62"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:05ef5246a7ffd2ce12a619cbb29f3307b7c4509307b1b49f456657b43529dc6f"}, - {file = "pydantic-1.8.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:54cd5121383f4a461ff7644c7ca20c0419d58052db70d8791eacbbe31528916b"}, - {file = "pydantic-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:4be75bebf676a5f0f87937c6ddb061fa39cbea067240d98e298508c1bda6f3f3"}, - {file = "pydantic-1.8.2-py3-none-any.whl", hash = "sha256:fec866a0b59f372b7e776f2d7308511784dace622e0992a0b59ea3ccee0ae833"}, - {file = "pydantic-1.8.2.tar.gz", hash = "sha256:26464e57ccaafe72b7ad156fdaa4e9b9ef051f69e175dbbb463283000c05ab7b"}, -] -pydocstyle = [ - {file = "pydocstyle-6.1.1-py3-none-any.whl", hash = "sha256:6987826d6775056839940041beef5c08cc7e3d71d63149b48e36727f70144dc4"}, - {file = "pydocstyle-6.1.1.tar.gz", hash = "sha256:1d41b7c459ba0ee6c345f2eb9ae827cab14a7533a88c5c6f7e94923f72df92dc"}, -] -pyflakes = [ - {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, - {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, -] -pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pytest = [ - {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, - {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, -] -pytest-cov = [ - {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, - {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, -] -pytest-deadfixtures = [ - {file = "pytest-deadfixtures-2.2.1.tar.gz", hash = "sha256:ca15938a4e8330993ccec9c6c847383d88b3cd574729530647dc6b492daa9c1e"}, - {file = "pytest_deadfixtures-2.2.1-py2.py3-none-any.whl", hash = "sha256:db71533f2d9456227084e00a1231e732973e299ccb7c37ab92e95032ab6c083e"}, -] -pytest-django = [ - {file = "pytest-django-4.4.0.tar.gz", hash = "sha256:b5171e3798bf7e3fc5ea7072fe87324db67a4dd9f1192b037fed4cc3c1b7f455"}, - {file = "pytest_django-4.4.0-py3-none-any.whl", hash = "sha256:65783e78382456528bd9d79a35843adde9e6a47347b20464eb2c885cb0f1f606"}, -] -pytest-randomly = [ - {file = "pytest-randomly-3.8.0.tar.gz", hash = "sha256:d9e21a72446757129378beea00bc9a32df1fb1cfd0bbe408be1ae9685bdf1209"}, - {file = "pytest_randomly-3.8.0-py3-none-any.whl", hash = "sha256:f5b7a09e84ee1eabcdedbb73c51d0929ae2f582bab6941dbb513bb49296d6340"}, -] -pytest-testmon = [ - {file = "pytest-testmon-1.1.1.tar.gz", hash = "sha256:c8810f991545e352f646fb382e5962ff54b8aa52b09d62d35ae04f0d7a9c58d9"}, -] -pytest-timeout = [ - {file = "pytest-timeout-1.4.2.tar.gz", hash = "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76"}, - {file = "pytest_timeout-1.4.2-py2.py3-none-any.whl", hash = "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063"}, -] -python-decouple = [ - {file = "python-decouple-3.4.tar.gz", hash = "sha256:2e5adb0263a4f963b58d7407c4760a2465d464ee212d733e2a2c179e54c08d8f"}, - {file = "python_decouple-3.4-py3-none-any.whl", hash = "sha256:a8268466e6389a639a20deab9d880faee186eb1eb6a05e54375bdf158d691981"}, -] -python-slugify = [ - {file = "python-slugify-5.0.2.tar.gz", hash = "sha256:f13383a0b9fcbe649a1892b9c8eb4f8eab1d6d84b84bb7a624317afa98159cab"}, - {file = "python_slugify-5.0.2-py2.py3-none-any.whl", hash = "sha256:6d8c5df75cd4a7c3a2d21e257633de53f52ab0265cd2d1dc62a730e8194a7380"}, -] -pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, -] -pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] -requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, -] -restructuredtext-lint = [ - {file = "restructuredtext_lint-1.3.2.tar.gz", hash = "sha256:d3b10a1fe2ecac537e51ae6d151b223b78de9fafdd50e5eb6b08c243df173c80"}, -] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.17.10-py3-none-any.whl", hash = "sha256:ffb9b703853e9e8b7861606dfdab1026cf02505bade0653d1880f4b2db47f815"}, - {file = "ruamel.yaml-0.17.10.tar.gz", hash = "sha256:106bc8d6dc6a0ff7c9196a47570432036f41d556b779c6b4e618085f57e39e67"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:cfdb9389d888c5b74af297e51ce357b800dd844898af9d4a547ffc143fa56751"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7b2927e92feb51d830f531de4ccb11b320255ee95e791022555971c466af4527"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win32.whl", hash = "sha256:ada3f400d9923a190ea8b59c8f60680c4ef8a4b0dfae134d2f2ff68429adfab5"}, - {file = "ruamel.yaml.clib-0.2.6-cp35-cp35m-win_amd64.whl", hash = "sha256:de9c6b8a1ba52919ae919f3ae96abb72b994dd0350226e28f3686cb4f142165c"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d67f273097c368265a7b81e152e07fb90ed395df6e552b9fa858c6d2c9f42502"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:72a2b8b2ff0a627496aad76f37a652bcef400fd861721744201ef1b45199ab78"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win32.whl", hash = "sha256:9efef4aab5353387b07f6b22ace0867032b900d8e91674b5d8ea9150db5cae94"}, - {file = "ruamel.yaml.clib-0.2.6-cp36-cp36m-win_amd64.whl", hash = "sha256:846fc8336443106fe23f9b6d6b8c14a53d38cef9a375149d61f99d78782ea468"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0847201b767447fc33b9c235780d3aa90357d20dd6108b92be544427bea197dd"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:78988ed190206672da0f5d50c61afef8f67daa718d614377dcd5e3ed85ab4a99"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win32.whl", hash = "sha256:a49e0161897901d1ac9c4a79984b8410f450565bbad64dbfcbf76152743a0cdb"}, - {file = "ruamel.yaml.clib-0.2.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bf75d28fa071645c529b5474a550a44686821decebdd00e21127ef1fd566eabe"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a32f8d81ea0c6173ab1b3da956869114cae53ba1e9f72374032e33ba3118c233"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7f7ecb53ae6848f959db6ae93bdff1740e651809780822270eab111500842a84"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win32.whl", hash = "sha256:89221ec6d6026f8ae859c09b9718799fea22c0e8da8b766b0b2c9a9ba2db326b"}, - {file = "ruamel.yaml.clib-0.2.6-cp38-cp38-win_amd64.whl", hash = "sha256:31ea73e564a7b5fbbe8188ab8b334393e06d997914a4e184975348f204790277"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dc6a613d6c74eef5a14a214d433d06291526145431c3b964f5e16529b1842bed"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1866cf2c284a03b9524a5cc00daca56d80057c5ce3cdc86a52020f4c720856f0"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win32.whl", hash = "sha256:3fb9575a5acd13031c57a62cc7823e5d2ff8bc3835ba4d94b921b4e6ee664104"}, - {file = "ruamel.yaml.clib-0.2.6-cp39-cp39-win_amd64.whl", hash = "sha256:825d5fccef6da42f3c8eccd4281af399f21c02b32d98e113dbc631ea6a6ecbc7"}, - {file = "ruamel.yaml.clib-0.2.6.tar.gz", hash = "sha256:4ff604ce439abb20794f05613c374759ce10e3595d1867764dd1ae675b85acbd"}, -] -safety = [ - {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"}, - {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -smmap = [ - {file = "smmap-4.0.0-py2.py3-none-any.whl", hash = "sha256:a9a7479e4c572e2e775c404dcd3080c8dc49f39918c2cf74913d30c4c478e3c2"}, - {file = "smmap-4.0.0.tar.gz", hash = "sha256:7e65386bd122d45405ddf795637b7f7d2b532e7e401d46bbe3fb49b9986d5182"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, -] -sortedcontainers = [ - {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, - {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, -] -sphinx = [ - {file = "Sphinx-4.0.3-py3-none-any.whl", hash = "sha256:5747f3c855028076fcff1e4df5e75e07c836f0ac11f7df886747231092cfe4ad"}, - {file = "Sphinx-4.0.3.tar.gz", hash = "sha256:dff357e6a208eb7edb2002714733ac21a9fe597e73609ff417ab8cf0c6b4fbb8"}, -] -sphinx-autodoc-typehints = [ - {file = "sphinx-autodoc-typehints-1.12.0.tar.gz", hash = "sha256:193617d9dbe0847281b1399d369e74e34cd959c82e02c7efde077fca908a9f52"}, - {file = "sphinx_autodoc_typehints-1.12.0-py3-none-any.whl", hash = "sha256:5e81776ec422dd168d688ab60f034fccfafbcd94329e9537712c93003bddc04a"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -sqlparse = [ - {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, - {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, -] -stevedore = [ - {file = "stevedore-3.3.0-py3-none-any.whl", hash = "sha256:50d7b78fbaf0d04cd62411188fa7eedcb03eb7f4c4b37005615ceebe582aa82a"}, - {file = "stevedore-3.3.0.tar.gz", hash = "sha256:3a5bbd0652bf552748871eaa73a4a8dc2899786bc497a2aa1fcb4dcdb0debeee"}, -] -structlog = [ - {file = "structlog-21.1.0-py2.py3-none-any.whl", hash = "sha256:62f06fc0ee32fb8580f0715eea66cb87271eb7efb0eaf9af6b639cba8981de47"}, - {file = "structlog-21.1.0.tar.gz", hash = "sha256:d9d2d890532e8db83c6977a2a676fb1889922ff0c26ad4dc0ecac26f9fafbc57"}, -] -testfixtures = [ - {file = "testfixtures-6.17.1-py2.py3-none-any.whl", hash = "sha256:9ed31e83f59619e2fa17df053b241e16e0608f4580f7b5a9333a0c9bdcc99137"}, - {file = "testfixtures-6.17.1.tar.gz", hash = "sha256:5ec3a0dd6f71cc4c304fbc024a10cc293d3e0b852c868014b9f233203e149bda"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomlkit = [ - {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, - {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, -] -traitlets = [ - {file = "traitlets-5.0.5-py3-none-any.whl", hash = "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426"}, - {file = "traitlets-5.0.5.tar.gz", hash = "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, -] -urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -wemake-python-styleguide = [ - {file = "wemake-python-styleguide-0.15.3.tar.gz", hash = "sha256:8b89aedabae67b7b915908ed06c178b702068137c0d8afe1fb59cdc829cd2143"}, - {file = "wemake_python_styleguide-0.15.3-py3-none-any.whl", hash = "sha256:a382f6c9ec87d56daa08a11e47cab019c99b384f1393b32564ebc74c6da80441"}, -] -win32-setctime = [ - {file = "win32_setctime-1.0.3-py3-none-any.whl", hash = "sha256:dc925662de0a6eb987f0b01f599c01a8236cb8c62831c22d9cada09ad958243e"}, - {file = "win32_setctime-1.0.3.tar.gz", hash = "sha256:4e88556c32fdf47f64165a2180ba4552f8bb32c1103a2fafd05723a0bd42bd4b"}, -] -yamllint = [ - {file = "yamllint-1.26.1.tar.gz", hash = "sha256:87d9462b3ed7e9dfa19caa177f7a77cd9888b3dc4044447d6ae0ab233bcd1324"}, -] -zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, -] diff --git a/new-github-repos/pyproject.toml b/new-github-repos/pyproject.toml deleted file mode 100644 index e602fb0..0000000 --- a/new-github-repos/pyproject.toml +++ /dev/null @@ -1,73 +0,0 @@ -[build-system] -requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" - - -[tool.nitpick] - - -[tool.poetry] -name = "github-repos" -description = "github repos" -version = "0.1.0" -readme = "README.md" -authors = ["balsh"] - - -[tool.poetry.dependencies] -python = "3.8.9" -django = "^3" -django-split-settings = "^1.0" -django-axes = "^5.20" -django-csp = "^3.7" -django-health-check = "^3.16" -django-http-referrer-policy = "^1.1" -django-permissions-policy = "^4.1" -django-stubs-ext = "^0.2" - -psycopg2-binary = "<2.9" -gunicorn = "^20.0" -python-decouple = "^3.4" -bcrypt = "^3.2" -structlog = "^21.1" - - -[tool.poetry.dev-dependencies] -django-debug-toolbar = "^3.2" -django-querycount = "^0.7" -django-migration-linter = "^3.0" -django-extra-checks = "^0.11" -django-coverage-plugin = "^2.0" -nplusone = "^1.0" - -wemake-python-styleguide = "^0.15" -flake8-pytest-style = "^1.5" -flake8-django = "^1.1" -flake8-logging-format = "^0.6" -nitpick = "^0.26" - -pytest = "^6.2" -pytest-django = "^4.4" -pytest-cov = "^2.12" -pytest-randomly = "^3.8" -pytest-deadfixtures = "^2.2" -pytest-testmon = "^1.1" -pytest-timeout = "^1.4" -django-test-migrations = "^1.1" -hypothesis = "^6.14" - -mypy = "^0.910" -django-stubs = "^1.8" - -sphinx = "^4.0" -sphinx-autodoc-typehints = "^1.12" -tomlkit = "^0.7" -doc8 = "^0.8" - -yamllint = "^1.26" -safety = "^1.10" -dotenv-linter = "^0.2" -polint = "^0.4" -dennis = "^0.9" -dump-env = "^1.3" -ipython = "^7.25" diff --git a/new-github-repos/server/__init__.py b/new-github-repos/server/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/server/apps/__init__.py b/new-github-repos/server/apps/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/server/apps/main/__init__.py b/new-github-repos/server/apps/main/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/server/apps/main/admin.py b/new-github-repos/server/apps/main/admin.py deleted file mode 100644 index 8f3ce90..0000000 --- a/new-github-repos/server/apps/main/admin.py +++ /dev/null @@ -1,8 +0,0 @@ -from django.contrib import admin - -from server.apps.main.models import BlogPost - - -@admin.register(BlogPost) -class BlogPostAdmin(admin.ModelAdmin[BlogPost]): - """Admin panel example for ``BlogPost`` model.""" diff --git a/new-github-repos/server/apps/main/logic/__init__.py b/new-github-repos/server/apps/main/logic/__init__.py deleted file mode 100644 index f6d5d66..0000000 --- a/new-github-repos/server/apps/main/logic/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -""" -This package is a place for your business logic. - -Please, do not create any other files inside your app package. -Place all files here, including: logic, forms, serializers. - -Decoupling is a good thing. We need more of that. - -Try using https://github.com/dry-python/ -It is awesome for writing business logic! -""" diff --git a/new-github-repos/server/apps/main/migrations/0001_initial.py b/new-github-repos/server/apps/main/migrations/0001_initial.py deleted file mode 100644 index a3003ed..0000000 --- a/new-github-repos/server/apps/main/migrations/0001_initial.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 2.2.7 on 2019-11-24 11:01 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - """Initial migration that creates the example BlogPost model.""" - - initial = True - dependencies = [] - - operations = [ - migrations.CreateModel( - name='BlogPost', - fields=[ - ( - 'id', - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name='ID', - ), - ), - ('title', models.CharField(max_length=80)), - ('body', models.TextField()), - ('created_at', models.DateTimeField(auto_now_add=True)), - ('updated_at', models.DateTimeField(auto_now=True)), - ], - options={ - 'verbose_name': 'BlogPost', - 'verbose_name_plural': 'BlogPosts', - }, - ), - ] diff --git a/new-github-repos/server/apps/main/migrations/__init__.py b/new-github-repos/server/apps/main/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/new-github-repos/server/apps/main/models.py b/new-github-repos/server/apps/main/models.py deleted file mode 100644 index d1b3246..0000000 --- a/new-github-repos/server/apps/main/models.py +++ /dev/null @@ -1,33 +0,0 @@ -import textwrap -from typing import Final, final - -from django.db import models - -#: That's how constants should be defined. -_POST_TITLE_MAX_LENGTH: Final = 80 - - -@final -class BlogPost(models.Model): - """ - This model is used just as an example. - - With it we show how one can: - - Use fixtures and factories - - Use migrations testing - - """ - - title = models.CharField(max_length=_POST_TITLE_MAX_LENGTH) - body = models.TextField() - - created_at = models.DateTimeField(auto_now_add=True) - updated_at = models.DateTimeField(auto_now=True) - - class Meta(object): - verbose_name = 'BlogPost' # You can probably use `gettext` for this - verbose_name_plural = 'BlogPosts' - - def __str__(self) -> str: - """All django models should have this method.""" - return textwrap.wrap(self.title, _POST_TITLE_MAX_LENGTH // 4)[0] diff --git a/new-github-repos/server/apps/main/static/main/css/index.css b/new-github-repos/server/apps/main/static/main/css/index.css deleted file mode 100644 index 3c274c2..0000000 --- a/new-github-repos/server/apps/main/static/main/css/index.css +++ /dev/null @@ -1,29 +0,0 @@ -body { - text-align: center; -} - -img { - max-width: 100%; - height: auto; -} - -.wemake-services-body { - height: 95vh; - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: center; - align-items: center; -} - -.wemake-services-logo { - max-width: 250px; - margin: 0 auto; -} - -.github-corner img { - position: absolute; - top: 0; - right: 0; - border: 0; -} diff --git a/new-github-repos/server/apps/main/static/main/images/favicon-16x16.png b/new-github-repos/server/apps/main/static/main/images/favicon-16x16.png deleted file mode 100644 index 9ec7aa6..0000000 Binary files a/new-github-repos/server/apps/main/static/main/images/favicon-16x16.png and /dev/null differ diff --git a/new-github-repos/server/apps/main/static/main/images/favicon-32x32.png b/new-github-repos/server/apps/main/static/main/images/favicon-32x32.png deleted file mode 100644 index 3fe008d..0000000 Binary files a/new-github-repos/server/apps/main/static/main/images/favicon-32x32.png and /dev/null differ diff --git a/new-github-repos/server/apps/main/templates/main/index.html b/new-github-repos/server/apps/main/templates/main/index.html deleted file mode 100644 index a4cf980..0000000 --- a/new-github-repos/server/apps/main/templates/main/index.html +++ /dev/null @@ -1,46 +0,0 @@ -{% load static %} - - - - - - wemake-django-template - - - - - - - - - - - - - - - - Fork me on GitHub - - - - -
- - -

wemake-django-template

-
- - diff --git a/new-github-repos/server/apps/main/urls.py b/new-github-repos/server/apps/main/urls.py deleted file mode 100644 index a5c8968..0000000 --- a/new-github-repos/server/apps/main/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.urls import path - -from server.apps.main.views import index - -app_name = 'main' - -urlpatterns = [ - path('hello/', index, name='hello'), -] diff --git a/new-github-repos/server/apps/main/views.py b/new-github-repos/server/apps/main/views.py deleted file mode 100644 index cb9bb4f..0000000 --- a/new-github-repos/server/apps/main/views.py +++ /dev/null @@ -1,12 +0,0 @@ -from django.http import HttpRequest, HttpResponse -from django.shortcuts import render - - -def index(request: HttpRequest) -> HttpResponse: - """ - Main (or index) view. - - Returns rendered default page to the user. - Typed with the help of ``django-stubs`` project. - """ - return render(request, 'main/index.html') diff --git a/new-github-repos/server/settings/__init__.py b/new-github-repos/server/settings/__init__.py deleted file mode 100644 index b36b882..0000000 --- a/new-github-repos/server/settings/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -This is a django-split-settings main file. - -For more information read this: -https://github.com/sobolevn/django-split-settings -https://sobolevn.me/2017/04/managing-djangos-settings - -To change settings file: -`DJANGO_ENV=production python manage.py runserver` -""" - -from os import environ - -import django_stubs_ext -from split_settings.tools import include, optional - -# Monkeypatching Django, so stubs will work for all generics, -# see: https://github.com/typeddjango/django-stubs -django_stubs_ext.monkeypatch() - -# Managing environment via `DJANGO_ENV` variable: -environ.setdefault('DJANGO_ENV', 'development') -_ENV = environ['DJANGO_ENV'] - -_base_settings = ( - 'components/common.py', - 'components/logging.py', - 'components/csp.py', - 'components/caches.py', - - # Select the right env: - 'environments/{0}.py'.format(_ENV), - - # Optionally override some settings: - optional('environments/local.py'), -) - -# Include settings: -include(*_base_settings) diff --git a/new-github-repos/server/settings/components/__init__.py b/new-github-repos/server/settings/components/__init__.py deleted file mode 100644 index e511469..0000000 --- a/new-github-repos/server/settings/components/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -from pathlib import Path - -from decouple import AutoConfig - -# Build paths inside the project like this: BASE_DIR.joinpath('some') -# `pathlib` is better than writing: dirname(dirname(dirname(__file__))) -BASE_DIR = Path.cwd().parent.parent.parent.parent - -# Loading `.env` files -# See docs: https://gitlab.com/mkleehammer/autoconfig -config = AutoConfig(search_path=BASE_DIR.joinpath('config')) diff --git a/new-github-repos/server/settings/components/caches.py b/new-github-repos/server/settings/components/caches.py deleted file mode 100644 index 3c36014..0000000 --- a/new-github-repos/server/settings/components/caches.py +++ /dev/null @@ -1,16 +0,0 @@ -# Caching -# https://docs.djangoproject.com/en/2.2/topics/cache/ - -CACHES = { - 'default': { - # TODO: use some other cache in production, - # like https://github.com/jazzband/django-redis - 'BACKEND': 'django.core.cache.backends.locmem.LocMemCache', - }, -} - - -# django-axes -# https://django-axes.readthedocs.io/en/latest/4_configuration.html#configuring-caches - -AXES_CACHE = 'default' diff --git a/new-github-repos/server/settings/components/common.py b/new-github-repos/server/settings/components/common.py deleted file mode 100644 index 9488c60..0000000 --- a/new-github-repos/server/settings/components/common.py +++ /dev/null @@ -1,201 +0,0 @@ -""" -Django settings for server project. - -For more information on this file, see -https://docs.djangoproject.com/en/2.2/topics/settings/ - -For the full list of settings and their config, see -https://docs.djangoproject.com/en/2.2/ref/settings/ -""" - -from typing import Dict, List, Tuple, Union - -from django.utils.translation import ugettext_lazy as _ - -from server.settings.components import BASE_DIR, config - -# Quick-start development settings - unsuitable for production -# See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ - -SECRET_KEY = config('DJANGO_SECRET_KEY') - -# Application definition: - -INSTALLED_APPS: Tuple[str, ...] = ( - # Your apps go here: - 'server.apps.main', - - # Default django apps: - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - - # django-admin: - 'django.contrib.admin', - 'django.contrib.admindocs', - - # Security: - 'axes', - - # Health checks: - # You may want to enable other checks as well, - # see: https://github.com/KristianOellegaard/django-health-check - 'health_check', - 'health_check.db', - 'health_check.cache', - 'health_check.storage', -) - -MIDDLEWARE: Tuple[str, ...] = ( - # Content Security Policy: - 'csp.middleware.CSPMiddleware', - - # Django: - 'django.middleware.security.SecurityMiddleware', - # django-permissions-policy - 'django_permissions_policy.PermissionsPolicyMiddleware', - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.locale.LocaleMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', - - # Axes: - 'axes.middleware.AxesMiddleware', - - # Django HTTP Referrer Policy: - 'django_http_referrer_policy.middleware.ReferrerPolicyMiddleware', -) - -ROOT_URLCONF = 'server.urls' - -WSGI_APPLICATION = 'server.wsgi.application' - - -# Database -# https://docs.djangoproject.com/en/2.2/ref/settings/#databases - -DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'NAME': config('POSTGRES_DB'), - 'USER': config('POSTGRES_USER'), - 'PASSWORD': config('POSTGRES_PASSWORD'), - 'HOST': config('DJANGO_DATABASE_HOST'), - 'PORT': config('DJANGO_DATABASE_PORT', cast=int), - 'CONN_MAX_AGE': config('CONN_MAX_AGE', cast=int, default=60), - 'OPTIONS': { - 'connect_timeout': 10, - }, - }, -} - - -# Internationalization -# https://docs.djangoproject.com/en/2.2/topics/i18n/ - -LANGUAGE_CODE = 'en-us' - -USE_I18N = True -USE_L10N = True - -LANGUAGES = ( - ('en', _('English')), - ('ru', _('Russian')), -) - -LOCALE_PATHS = ( - 'locale/', -) - -USE_TZ = True -TIME_ZONE = 'UTC' - - -# Static files (CSS, JavaScript, Images) -# https://docs.djangoproject.com/en/2.2/howto/static-files/ - -STATIC_URL = '/static/' - -STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -) - - -# Templates -# https://docs.djangoproject.com/en/2.2/ref/templates/api - -TEMPLATES = [{ - 'APP_DIRS': True, - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [ - # Contains plain text templates, like `robots.txt`: - BASE_DIR.joinpath('server', 'templates'), - ], - 'OPTIONS': { - 'context_processors': [ - # Default template context processors: - 'django.contrib.auth.context_processors.auth', - 'django.template.context_processors.debug', - 'django.template.context_processors.i18n', - 'django.template.context_processors.media', - 'django.contrib.messages.context_processors.messages', - 'django.template.context_processors.request', - ], - }, -}] - - -# Media files -# Media root dir is commonly changed in production -# (see development.py and production.py). -# https://docs.djangoproject.com/en/2.2/topics/files/ - -MEDIA_URL = '/media/' -MEDIA_ROOT = BASE_DIR.joinpath('media') - - -# Django authentication system -# https://docs.djangoproject.com/en/2.2/topics/auth/ - -AUTHENTICATION_BACKENDS = ( - 'axes.backends.AxesBackend', - 'django.contrib.auth.backends.ModelBackend', -) - -PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.BCryptSHA256PasswordHasher', - 'django.contrib.auth.hashers.BCryptPasswordHasher', - 'django.contrib.auth.hashers.PBKDF2PasswordHasher', - 'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher', - 'django.contrib.auth.hashers.Argon2PasswordHasher', -] - - -# Security -# https://docs.djangoproject.com/en/2.2/topics/security/ - -SESSION_COOKIE_HTTPONLY = True -CSRF_COOKIE_HTTPONLY = True -SECURE_CONTENT_TYPE_NOSNIFF = True -SECURE_BROWSER_XSS_FILTER = True - -X_FRAME_OPTIONS = 'DENY' - -# https://github.com/DmytroLitvinov/django-http-referrer-policy -# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy -REFERRER_POLICY = 'same-origin' - -# https://github.com/adamchainz/django-permissions-policy#setting -PERMISSIONS_POLICY: Dict[str, Union[str, List[str]]] = {} # noqa: WPS234 - - -# Timeouts -# https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-EMAIL_TIMEOUT - -EMAIL_TIMEOUT = 5 diff --git a/new-github-repos/server/settings/components/csp.py b/new-github-repos/server/settings/components/csp.py deleted file mode 100644 index cb07478..0000000 --- a/new-github-repos/server/settings/components/csp.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -This file contains a definition for Content-Security-Policy headers. - -Read more about it: -https://developer.mozilla.org/ru/docs/Web/HTTP/Headers/Content-Security-Policy - -We are using `django-csp` to provide these headers. -Docs: https://github.com/mozilla/django-csp -""" - -CSP_SCRIPT_SRC = ("'self'",) -CSP_IMG_SRC = ("'self'",) -CSP_FONT_SRC = ("'self'",) -CSP_STYLE_SRC = ("'self'",) -CSP_DEFAULT_SRC = ("'none'",) diff --git a/new-github-repos/server/settings/components/logging.py b/new-github-repos/server/settings/components/logging.py deleted file mode 100644 index e7c9b09..0000000 --- a/new-github-repos/server/settings/components/logging.py +++ /dev/null @@ -1,77 +0,0 @@ -# Logging -# https://docs.djangoproject.com/en/2.2/topics/logging/ - -# See also: -# 'Do not log' by Nikita Sobolev (@sobolevn) -# https://sobolevn.me/2020/03/do-not-log - -import structlog - -LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - - # We use these formatters in our `'handlers'` configuration. - # Probably, you won't need to modify these lines. - # Unless, you know what you are doing. - 'formatters': { - 'json_formatter': { - '()': structlog.stdlib.ProcessorFormatter, - 'processor': structlog.processors.JSONRenderer(), - }, - 'console': { - '()': structlog.stdlib.ProcessorFormatter, - 'processor': structlog.processors.KeyValueRenderer( - key_order=['timestamp', 'level', 'event', 'logger'], - ), - }, - }, - - # You can easily swap `key/value` (default) output and `json` ones. - # Use `'json_console'` if you need `json` logs. - 'handlers': { - 'console': { - 'class': 'logging.StreamHandler', - 'formatter': 'console', - }, - 'json_console': { - 'class': 'logging.StreamHandler', - 'formatter': 'json_formatter', - }, - }, - - # These loggers are required by our app: - # - django is required when using `logger.getLogger('django')` - # - security is required by `axes` - 'loggers': { - 'django': { - 'handlers': ['console'], - 'propagate': True, - 'level': 'INFO', - }, - 'security': { - 'handlers': ['console'], - 'level': 'ERROR', - 'propagate': False, - }, - }, -} - -structlog.configure( - processors=[ - structlog.stdlib.filter_by_level, - structlog.processors.TimeStamper(fmt='iso'), - structlog.stdlib.add_logger_name, - structlog.stdlib.add_log_level, - structlog.stdlib.PositionalArgumentsFormatter(), - structlog.processors.StackInfoRenderer(), - structlog.processors.format_exc_info, - structlog.processors.UnicodeDecoder(), - structlog.processors.ExceptionPrettyPrinter(), - structlog.stdlib.ProcessorFormatter.wrap_for_formatter, - ], - context_class=structlog.threadlocal.wrap_dict(dict), - logger_factory=structlog.stdlib.LoggerFactory(), - wrapper_class=structlog.stdlib.BoundLogger, - cache_logger_on_first_use=True, -) diff --git a/new-github-repos/server/settings/environments/__init__.py b/new-github-repos/server/settings/environments/__init__.py deleted file mode 100644 index 5de2bea..0000000 --- a/new-github-repos/server/settings/environments/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ - -"""Overriding settings based on the environment.""" diff --git a/new-github-repos/server/settings/environments/development.py b/new-github-repos/server/settings/environments/development.py deleted file mode 100644 index 7aad66a..0000000 --- a/new-github-repos/server/settings/environments/development.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -This file contains all the settings that defines the development server. - -SECURITY WARNING: don't run with debug turned on in production! -""" - -import logging -from typing import List - -from server.settings.components import config -from server.settings.components.common import ( - DATABASES, - INSTALLED_APPS, - MIDDLEWARE, -) - -# Setting the development status: - -DEBUG = True - -ALLOWED_HOSTS = [ - config('DOMAIN_NAME'), - 'localhost', - '0.0.0.0', # noqa: S104 - '127.0.0.1', - '[::1]', -] - - -# Installed apps for development only: - -INSTALLED_APPS += ( - # Better debug: - 'debug_toolbar', - 'nplusone.ext.django', - - # Linting migrations: - 'django_migration_linter', - - # django-test-migrations: - 'django_test_migrations.contrib.django_checks.AutoNames', - # This check might be useful in production as well, - # so it might be a good idea to move `django-test-migrations` - # to prod dependencies and use this check in the main `settings.py`. - # This will check that your database is configured properly, - # when you run `python manage.py check` before deploy. - 'django_test_migrations.contrib.django_checks.DatabaseConfiguration', - - # django-extra-checks: - 'extra_checks', -) - - -# Static files: -# https://docs.djangoproject.com/en/2.2/ref/settings/#std:setting-STATICFILES_DIRS - -STATICFILES_DIRS: List[str] = [] - - -# Django debug toolbar: -# https://django-debug-toolbar.readthedocs.io - -MIDDLEWARE += ( - 'debug_toolbar.middleware.DebugToolbarMiddleware', - - # https://github.com/bradmontgomery/django-querycount - # Prints how many queries were executed, useful for the APIs. - 'querycount.middleware.QueryCountMiddleware', -) - - -def _custom_show_toolbar(request): - """Only show the debug toolbar to users with the superuser flag.""" - return DEBUG and request.user.is_superuser - - -DEBUG_TOOLBAR_CONFIG = { - 'SHOW_TOOLBAR_CALLBACK': - 'server.settings.environments.development._custom_show_toolbar', -} - -# This will make debug toolbar to work with django-csp, -# since `ddt` loads some scripts from `ajax.googleapis.com`: -CSP_SCRIPT_SRC = ("'self'", 'ajax.googleapis.com') -CSP_IMG_SRC = ("'self'", 'data:') -CSP_CONNECT_SRC = ("'self'",) - - -# nplusone -# https://github.com/jmcarp/nplusone - -# Should be the first in line: -MIDDLEWARE = ( # noqa: WPS440 - 'nplusone.ext.django.NPlusOneMiddleware', -) + MIDDLEWARE - -# Logging N+1 requests: -NPLUSONE_RAISE = True # comment out if you want to allow N+1 requests -NPLUSONE_LOGGER = logging.getLogger('django') -NPLUSONE_LOG_LEVEL = logging.WARN -NPLUSONE_WHITELIST = [ - {'model': 'admin.*'}, -] - - -# django-test-migrations -# https://github.com/wemake-services/django-test-migrations - -# Set of badly named migrations to ignore: -DTM_IGNORED_MIGRATIONS = frozenset(( - ('axes', '*'), -)) - - -# django-extra-checks -# https://github.com/kalekseev/django-extra-checks - -EXTRA_CHECKS = { - 'checks': [ - # Forbid `unique_together`: - 'no-unique-together', - # Require non empty `upload_to` argument: - 'field-file-upload-to', - # Use the indexes option instead: - 'no-index-together', - # Each model must be registered in admin: - 'model-admin', - # FileField/ImageField must have non empty `upload_to` argument: - 'field-file-upload-to', - # Text fields shouldn't use `null=True`: - 'field-text-null', - # Prefer using BooleanField(null=True) instead of NullBooleanField: - 'field-boolean-null', - # Don't pass `null=False` to model fields (this is django default) - 'field-null', - # ForeignKey fields must specify db_index explicitly if used in - # other indexes: - {'id': 'field-foreign-key-db-index', 'when': 'indexes'}, - # If field nullable `(null=True)`, - # then default=None argument is redundant and should be removed: - 'field-default-null', - # Fields with choices must have companion CheckConstraint - # to enforce choices on database level - 'field-choices-constraint', - ], -} - -# Disable persistent DB connections -# https://docs.djangoproject.com/en/2.2/ref/databases/#caveats -DATABASES['default']['CONN_MAX_AGE'] = 0 diff --git a/new-github-repos/server/settings/environments/local.py.template b/new-github-repos/server/settings/environments/local.py.template deleted file mode 100644 index 13e9d81..0000000 --- a/new-github-repos/server/settings/environments/local.py.template +++ /dev/null @@ -1 +0,0 @@ -"""Override any custom settings here.""" diff --git a/new-github-repos/server/settings/environments/production.py b/new-github-repos/server/settings/environments/production.py deleted file mode 100644 index 1919e3c..0000000 --- a/new-github-repos/server/settings/environments/production.py +++ /dev/null @@ -1,75 +0,0 @@ -""" -This file contains all the settings used in production. - -This file is required and if development.py is present these -values are overridden. -""" - -from server.settings.components import config - -# Production flags: -# https://docs.djangoproject.com/en/2.2/howto/deployment/ - -DEBUG = False - -ALLOWED_HOSTS = [ - # TODO: check production hosts - config('DOMAIN_NAME'), - - # We need this value for `healthcheck` to work: - 'localhost', -] - - -# Staticfiles -# https://docs.djangoproject.com/en/2.2/ref/contrib/staticfiles/ - -# This is a hack to allow a special flag to be used with `--dry-run` -# to test things locally. -_COLLECTSTATIC_DRYRUN = config( - 'DJANGO_COLLECTSTATIC_DRYRUN', cast=bool, default=False, -) -# Adding STATIC_ROOT to collect static files via 'collectstatic': -STATIC_ROOT = '.static' if _COLLECTSTATIC_DRYRUN else '/var/www/django/static' - -STATICFILES_STORAGE = ( - # This is a string, not a tuple, - # but it does not fit into 80 characters rule. - 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage' -) - - -# Media files -# https://docs.djangoproject.com/en/2.2/topics/files/ - -MEDIA_ROOT = '/var/www/django/media' - - -# Password validation -# https://docs.djangoproject.com/en/2.2/ref/settings/#auth-password-validators - -_PASS = 'django.contrib.auth.password_validation' # noqa: S105 -AUTH_PASSWORD_VALIDATORS = [ - {'NAME': '{0}.UserAttributeSimilarityValidator'.format(_PASS)}, - {'NAME': '{0}.MinimumLengthValidator'.format(_PASS)}, - {'NAME': '{0}.CommonPasswordValidator'.format(_PASS)}, - {'NAME': '{0}.NumericPasswordValidator'.format(_PASS)}, -] - - -# Security -# https://docs.djangoproject.com/en/2.2/topics/security/ - -SECURE_HSTS_SECONDS = 31536000 # the same as Caddy has -SECURE_HSTS_INCLUDE_SUBDOMAINS = True -SECURE_HSTS_PRELOAD = True - -SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') -SECURE_SSL_REDIRECT = True -SECURE_REDIRECT_EXEMPT = [ - # This is required for healthcheck to work: - '^health/', -] - -SESSION_COOKIE_SECURE = True -CSRF_COOKIE_SECURE = True diff --git a/new-github-repos/server/templates/txt/humans.txt b/new-github-repos/server/templates/txt/humans.txt deleted file mode 100644 index 6153120..0000000 --- a/new-github-repos/server/templates/txt/humans.txt +++ /dev/null @@ -1,14 +0,0 @@ -# The humans responsible & technology colophon -# http://humanstxt.org/ - - -## balsh - -Team: - - -## Technologies - -Language: English -Doctype: HTML5 -Technologies: Python, Django diff --git a/new-github-repos/server/templates/txt/robots.txt b/new-github-repos/server/templates/txt/robots.txt deleted file mode 100644 index eb05362..0000000 --- a/new-github-repos/server/templates/txt/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/new-github-repos/server/urls.py b/new-github-repos/server/urls.py deleted file mode 100644 index 8be36c2..0000000 --- a/new-github-repos/server/urls.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -Main URL mapping configuration file. - -Include other URLConfs from external apps using method `include()`. - -It is also a good practice to keep a single URL to the root index page. - -This examples uses Django's default media -files serving technique in development. -""" - -from django.conf import settings -from django.contrib import admin -from django.contrib.admindocs import urls as admindocs_urls -from django.urls import include, path -from django.views.generic import TemplateView -from health_check import urls as health_urls - -from server.apps.main import urls as main_urls -from server.apps.main.views import index - -admin.autodiscover() - -urlpatterns = [ - # Apps: - path('main/', include(main_urls, namespace='main')), - - # Health checks: - path('health/', include(health_urls)), # noqa: DJ05 - - # django-admin: - path('admin/doc/', include(admindocs_urls)), # noqa: DJ05 - path('admin/', admin.site.urls), - - # Text and xml static files: - path('robots.txt', TemplateView.as_view( - template_name='txt/robots.txt', - content_type='text/plain', - )), - path('humans.txt', TemplateView.as_view( - template_name='txt/humans.txt', - content_type='text/plain', - )), - - # It is a good practice to have explicit index view: - path('', index, name='index'), -] - -if settings.DEBUG: # pragma: no cover - import debug_toolbar # noqa: WPS433 - from django.conf.urls.static import static # noqa: WPS433 - - urlpatterns = [ - # URLs specific only to django-debug-toolbar: - path('__debug__/', include(debug_toolbar.urls)), # noqa: DJ05 - ] + urlpatterns + static( # type: ignore - # Serving media files in development only: - settings.MEDIA_URL, - document_root=settings.MEDIA_ROOT, - ) diff --git a/new-github-repos/server/wsgi.py b/new-github-repos/server/wsgi.py deleted file mode 100644 index 52a14ea..0000000 --- a/new-github-repos/server/wsgi.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -WSGI config for server project. - -It exposes the WSGI callable as a module-level variable named ``application``. - -For more information on this file, see -https://docs.djangoproject.com/en/2.2/howto/deployment/wsgi/ -""" - -import os - -from django.core.wsgi import get_wsgi_application - -os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') -application = get_wsgi_application() diff --git a/new-github-repos/setup.cfg b/new-github-repos/setup.cfg deleted file mode 100644 index 7966869..0000000 --- a/new-github-repos/setup.cfg +++ /dev/null @@ -1,144 +0,0 @@ -# All configuration for plugins and other utils is defined here. -# Read more about `setup.cfg`: -# https://docs.python.org/3/distutils/configfile.html - - -[flake8] -# flake8 configuration: -# https://flake8.pycqa.org/en/latest/user/configuration.html -format = wemake -show-source = True -statistics = False -doctests = True -enable-extensions = G - -# darglint configuration: -# https://github.com/terrencepreilly/darglint -strictness = long -docstring-style = numpy - -# Flake plugins: -max-line-length = 80 -max-complexity = 6 - -# Excluding some directories: -exclude = .git,__pycache__,.venv,.eggs,*.egg - -# Disable some pydocstyle checks: -ignore = D100, D104, D106, D401, X100, W504, RST303, RST304, DAR103, DAR203 - -# Docs: https://github.com/snoack/flake8-per-file-ignores -# You can completely or partially disable our custom checks, -# to do so you have to ignore `WPS` letters for all python files: -per-file-ignores = - # Allow `__init__.py` with logic for configuration: - server/settings/*.py: WPS226, WPS407, WPS412, WPS432 - # Allow to have magic numbers inside migrations and wrong module names: - server/*/migrations/*.py: WPS102, WPS114, WPS432 - # Enable `assert` keyword and magic numbers for tests: - tests/*.py: S101, WPS432 - - -[isort] -# isort configuration: -# https://github.com/timothycrosley/isort/wiki/isort-Settings -include_trailing_comma = true -use_parentheses = true -# See https://github.com/timothycrosley/isort#multi-line-output-modes -multi_line_output = 3 -line_length = 80 - - -[tool:pytest] -# pytest configuration: -# https://docs.pytest.org/en/stable/customize.html - -# pytest-django configuration: -# https://pytest-django.readthedocs.io/en/latest/ -DJANGO_SETTINGS_MODULE = server.settings - -# Timeout for tests, so they can not take longer -# than this amount of seconds. -# You should adjust this value to be as low as possible. -# Configuration: -# https://pypi.org/project/pytest-timeout/ -timeout = 5 - -# Directories that are not visited by pytest collector: -norecursedirs = *.egg .eggs dist build docs .tox .git __pycache__ - -# You will need to measure your tests speed with `-n auto` and without it, -# so you can see whether it gives you any performance gain, or just gives -# you an overhead. See `docs/template/development-process.rst`. -addopts = - --strict-markers - --strict-config - --doctest-modules - --fail-on-template-vars - --dup-fixtures - # Output: - --tb=short - # Parallelism: - # -n auto - # --boxed - # Coverage: - --cov=server - --cov=tests - --cov-branch - --cov-report=term-missing:skip-covered - --cov-report=html - --cov-fail-under=100 - - -[coverage:run] -# Coverage configuration: -# https://coverage.readthedocs.io/en/latest/config.html -plugins = - # Docs: https://github.com/nedbat/django_coverage_plugin - django_coverage_plugin - - -[mypy] -# Mypy configuration: -# https://mypy.readthedocs.io/en/latest/config_file.html -allow_redefinition = False -check_untyped_defs = True -disallow_untyped_decorators = True -disallow_any_explicit = True -disallow_any_generics = True -disallow_untyped_calls = True -ignore_errors = False -ignore_missing_imports = True -implicit_reexport = False -local_partial_types = True -strict_optional = True -strict_equality = True -no_implicit_optional = True -warn_unused_ignores = True -warn_redundant_casts = True -warn_unused_configs = True -warn_unreachable = True -warn_no_return = True - -plugins = - mypy_django_plugin.main - -[mypy.plugins.django-stubs] -django_settings_module = server.settings - -[mypy-server.apps.*.migrations.*] -# Django migrations should not produce any errors: -ignore_errors = True - -[mypy-server.apps.*.models] -# FIXME: remove this line, when `django-stubs` will stop -# using `Any` inside. -disallow_any_explicit = False - - -[doc8] -# doc8 configuration: -# https://github.com/pycqa/doc8 -ignore-path = docs/_build -max-line-length = 80 -sphinx = True diff --git a/new-github-repos/tests/conftest.py b/new-github-repos/tests/conftest.py deleted file mode 100644 index 1e673a3..0000000 --- a/new-github-repos/tests/conftest.py +++ /dev/null @@ -1,45 +0,0 @@ -""" -This module is used to provide configuration, fixtures, and plugins for pytest. - -It may be also used for extending doctest's context: -1. https://docs.python.org/3/library/doctest.html -2. https://docs.pytest.org/en/latest/doctest.html -""" - -import pytest - - -@pytest.fixture(autouse=True) -def _media_root(settings, tmpdir_factory) -> None: - """Forces django to save media files into temp folder.""" - settings.MEDIA_ROOT = tmpdir_factory.mktemp('media', numbered=True) - - -@pytest.fixture(autouse=True) -def _password_hashers(settings) -> None: - """Forces django to use fast password hashers for tests.""" - settings.PASSWORD_HASHERS = [ - 'django.contrib.auth.hashers.MD5PasswordHasher', - ] - - -@pytest.fixture(autouse=True) -def _auth_backends(settings) -> None: - """Deactivates security backend from Axes app.""" - settings.AUTHENTICATION_BACKENDS = ( - 'django.contrib.auth.backends.ModelBackend', - ) - - -@pytest.fixture(autouse=True) -def _debug(settings) -> None: - """Sets proper DEBUG and TEMPLATE debug mode for coverage.""" - settings.DEBUG = False - for template in settings.TEMPLATES: - template['OPTIONS']['debug'] = True - - -@pytest.fixture() -def main_heading() -> str: - """An example fixture containing some html fragment.""" - return '

wemake-django-template

' diff --git a/new-github-repos/tests/test_apps/test_main/test_models/test_blog_post_model.py b/new-github-repos/tests/test_apps/test_main/test_models/test_blog_post_model.py deleted file mode 100644 index ba4a494..0000000 --- a/new-github-repos/tests/test_apps/test_main/test_models/test_blog_post_model.py +++ /dev/null @@ -1,16 +0,0 @@ -from hypothesis import given -from hypothesis.extra import django - -from server.apps.main.models import BlogPost - - -class TestBlogPost(django.TestCase): - """This is a property-based test that ensures model correctness.""" - - @given(django.from_model(BlogPost)) - def test_model_properties(self, instance: BlogPost) -> None: - """Tests that instance can be saved and has correct representation.""" - instance.save() - - assert instance.id > 0 - assert len(str(instance)) <= 20 diff --git a/new-github-repos/tests/test_apps/test_main/test_models/test_migrations/test_blog_post_migrations.py b/new-github-repos/tests/test_apps/test_main/test_models/test_migrations/test_blog_post_migrations.py deleted file mode 100644 index d153dc2..0000000 --- a/new-github-repos/tests/test_apps/test_main/test_models/test_migrations/test_blog_post_migrations.py +++ /dev/null @@ -1,17 +0,0 @@ -import pytest -from django_test_migrations.migrator import Migrator - -from server.apps.main.urls import app_name - - -def test_initial0001(migrator: Migrator) -> None: - """Tests the initial migration forward application.""" - old_state = migrator.apply_initial_migration((app_name, None)) - with pytest.raises(LookupError): - # This model does not exist before this migration: - old_state.apps.get_model(app_name, 'BlogPost') - - new_state = migrator.apply_tested_migration((app_name, '0001_initial')) - model = new_state.apps.get_model(app_name, 'BlogPost') - - assert model.objects.create(title='test', body='some body') diff --git a/new-github-repos/tests/test_apps/test_main/test_views/test_index_view.py b/new-github-repos/tests/test_apps/test_main/test_views/test_index_view.py deleted file mode 100644 index d2603ce..0000000 --- a/new-github-repos/tests/test_apps/test_main/test_views/test_index_view.py +++ /dev/null @@ -1,18 +0,0 @@ -from django.test import Client -from django.urls import reverse - - -def test_main_page(client: Client, main_heading: str) -> None: - """This test ensures that main page works.""" - response = client.get('/') - - assert response.status_code == 200 - assert main_heading in str(response.content) - - -def test_hello_page(client: Client, main_heading: str) -> None: - """This test ensures that hello page works.""" - response = client.get(reverse('main:hello')) - - assert response.status_code == 200 - assert main_heading in str(response.content) diff --git a/new-github-repos/tests/test_server/test_urls.py b/new-github-repos/tests/test_server/test_urls.py deleted file mode 100644 index 7e2bef7..0000000 --- a/new-github-repos/tests/test_server/test_urls.py +++ /dev/null @@ -1,55 +0,0 @@ -import pytest -from django.test import Client - - -@pytest.mark.django_db() -def test_health_check(client: Client) -> None: - """This test ensures that health check is accessible.""" - response = client.get('/health/') - - assert response.status_code == 200 - - -def test_admin_unauthorized(client: Client) -> None: - """This test ensures that admin panel requires auth.""" - response = client.get('/admin/') - - assert response.status_code == 302 - - -def test_admin_authorized(admin_client: Client) -> None: - """This test ensures that admin panel is accessible.""" - response = admin_client.get('/admin/') - - assert response.status_code == 200 - - -def test_admin_docs_unauthorized(client: Client) -> None: - """This test ensures that admin panel docs requires auth.""" - response = client.get('/admin/doc/') - - assert response.status_code == 302 - - -def test_admin_docs_authorized(admin_client: Client) -> None: - """This test ensures that admin panel docs are accessible.""" - response = admin_client.get('/admin/doc/') - - assert response.status_code == 200 - assert b'docutils' not in response.content - - -def test_robots_txt(client: Client) -> None: - """This test ensures that `robots.txt` is accessible.""" - response = client.get('/robots.txt') - - assert response.status_code == 200 - assert response.get('Content-Type') == 'text/plain' - - -def test_humans_txt(client: Client) -> None: - """This test ensures that `humans.txt` is accessible.""" - response = client.get('/humans.txt') - - assert response.status_code == 200 - assert response.get('Content-Type') == 'text/plain'