├── tests ├── __init__.py ├── conftest.py └── test_core.py ├── src └── pdm_publish │ ├── __init__.py │ ├── config.py │ ├── core.py │ └── command.py ├── .copier-answers.yml ├── .github ├── dependabot.yaml └── workflows │ ├── automerge.yaml │ └── ci.yaml ├── .pre-commit-config.yaml ├── scripts └── update-readme ├── pyproject.toml ├── CONTRIBUTING.md ├── .gitignore ├── README.md └── poetry.lock /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/pdm_publish/__init__.py: -------------------------------------------------------------------------------- 1 | from pdm import Core 2 | 3 | from .command import PublishCommand 4 | from .config import CONFIG 5 | 6 | 7 | def main(core: Core) -> None: 8 | core.register_command(PublishCommand) 9 | for k, v in CONFIG.items(): 10 | core.add_config(k, v) 11 | -------------------------------------------------------------------------------- /.copier-answers.yml: -------------------------------------------------------------------------------- 1 | # DO NOT EDIT: Generated by Copier 2 | _commit: v0.1.0 3 | _src_path: gh:branchvincent/python-template 4 | author_email: branchevincent@gmail.com 5 | author_name: Branch Vincent 6 | docker: false 7 | docs: false 8 | private: false 9 | project_description: A PDM plugin to publish to PyPI 10 | project_name: pdm_publish 11 | repo_name: pdm-publish 12 | repo_username: branchvincent 13 | -------------------------------------------------------------------------------- /.github/dependabot.yaml: -------------------------------------------------------------------------------- 1 | # yaml-language-server: $schema=https://raw.githubusercontent.com/SchemaStore/schemastore/master/src/schemas/json/dependabot-2.0.json 2 | version: 2 3 | updates: 4 | - package-ecosystem: "pip" 5 | directory: "/" 6 | schedule: 7 | interval: "weekly" 8 | labels: 9 | - automerge 10 | - package-ecosystem: "github-actions" 11 | directory: "/" 12 | schedule: 13 | interval: "weekly" 14 | labels: 15 | - automerge 16 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import pytest 4 | from pdm import Core, Project 5 | 6 | from pdm_publish.core import Publisher 7 | 8 | 9 | @pytest.fixture 10 | def core() -> Core: 11 | return Core() 12 | 13 | 14 | @pytest.fixture 15 | def project(core: Core, tmp_path: Path) -> Project: 16 | return Project(core, root_path=tmp_path) 17 | 18 | 19 | @pytest.fixture 20 | def publisher(project: Project) -> Publisher: 21 | return Publisher(project) 22 | -------------------------------------------------------------------------------- /src/pdm_publish/config.py: -------------------------------------------------------------------------------- 1 | from pdm.project.config import ConfigItem 2 | 3 | CONFIG = { 4 | "publish.repo": ConfigItem( 5 | description="PyPI repo name (pypi/testpypi) or url", 6 | default="pypi", 7 | env_var="PDM_PUBLISH_REPO", 8 | ), 9 | "publish.username": ConfigItem( 10 | description="PyPI username", default="__token__", env_var="PDM_PUBLISH_USERNAME" 11 | ), 12 | "publish.password": ConfigItem( 13 | description="PyPI password", env_var="PDM_PUBLISH_PASSWORD" 14 | ), 15 | } 16 | -------------------------------------------------------------------------------- /.github/workflows/automerge.yaml: -------------------------------------------------------------------------------- 1 | name: Automerge 2 | 3 | on: 4 | pull_request: 5 | types: [opened, synchronize, labeled, reopened] 6 | 7 | jobs: 8 | automerge: 9 | if: contains(github.event.pull_request.labels.*.name, 'automerge') 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Merge PR 13 | run: | 14 | gh pr merge --auto --squash --body="[cd skip]" "$PR_URL" 15 | gh pr review --approve "$PR_URL" 16 | env: 17 | PR_URL: ${{ github.event.pull_request.html_url }} 18 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 19 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | repos: 2 | - repo: https://github.com/asottile/pyupgrade 3 | rev: v2.11.0 4 | hooks: 5 | - id: pyupgrade 6 | - repo: local 7 | hooks: 8 | - id: isort 9 | name: isort 10 | entry: poetry run isort 11 | language: system 12 | types: [python] 13 | - id: black 14 | name: black 15 | entry: poetry run black 16 | language: system 17 | types: [python] 18 | - id: flake8 19 | name: flake8 20 | entry: poetry run pflake8 21 | language: system 22 | types: [python] 23 | - id: mypy 24 | name: mypy 25 | entry: poetry run mypy 26 | require_serial: true 27 | language: system 28 | types: [python] 29 | -------------------------------------------------------------------------------- /scripts/update-readme: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # from pdm_publish.config import CONFIG 4 | import re 5 | import sys 6 | from pathlib import Path 7 | from subprocess import check_output 8 | 9 | README = Path(__file__).parents[1] / "README.md" 10 | USAGE_RE = r""" 11 | ```sh 12 | \$ pdm publish --help 13 | (?P.*?) 14 | ``` 15 | """ 16 | CONFIG_RE = r""" 17 | \#\# Configuration 18 | (?P.*?) 19 | \#\# Links 20 | ``` 21 | """ 22 | 23 | 24 | def update_usage() -> None: 25 | usage = check_output([sys.executable, "-m", "pdm", "publish", "--help"], text=True) 26 | md = USAGE_RE.replace("(?P.*?)", usage) 27 | new = re.compile(USAGE_RE, re.DOTALL).sub(md, README.read_text()) 28 | README.write_text(new) 29 | 30 | 31 | def update_config() -> None: 32 | from pdm_publish.config import CONFIG 33 | 34 | table = [ 35 | "| Config Item | Description | Default Value | Available in Project | Env var |" 36 | ] 37 | table.append( 38 | "| ----------- | ----------- | ------------- | -------------------- | ------- |" 39 | ) 40 | for k, v in CONFIG.items(): 41 | table.append( 42 | f"|`{k}`|{v.description}|`{v.default}`|{not v.global_only}|`{v.env_var}`|" 43 | ) 44 | 45 | md = CONFIG_RE.replace("?P.*?)", "\n".join(table)) 46 | new = re.compile(CONFIG_RE, re.DOTALL).sub(md, README.read_text()) 47 | README.write_text(new) 48 | print(md) 49 | 50 | 51 | update_usage() 52 | update_config() 53 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "pdm-publish" 3 | version = "0.2.1" 4 | description = "A PDM plugin to publish to PyPI" 5 | authors = ["Branch Vincent "] 6 | readme = "README.md" 7 | repository = "https://github.com/branchv/pdm-publish" 8 | packages = [{ include = "pdm_publish", from = "src" }] 9 | 10 | [tool.poetry.dependencies] 11 | python = "^3.7" 12 | twine = "^3" 13 | pdm = "^1" 14 | 15 | [tool.poetry.dev-dependencies] 16 | black = "^21.6b0" 17 | flake8 = "^3.9.2" 18 | isort = "^5.9.2" 19 | mypy = "^0.910" 20 | pre-commit = "^2.13.0" 21 | pyproject-flake8 = "^0.0.1-alpha.2" 22 | pytest = "^6.2.4" 23 | taskipy = "^1.8.1" 24 | pytest-mock = "^3.6.1" 25 | 26 | [tool.poetry.plugins.pdm] 27 | publish = "pdm_publish.__init__:main" 28 | 29 | [tool.taskipy.tasks] 30 | clean = { cmd = "rm -rf .mypy_cache/ .pytest_cache/ build/ dist/ *.egg-info", help = "Remove build artifacts" } 31 | lint = { cmd = "pre-commit run --all-files", help = "Run linters and formatters" } 32 | test = { cmd = "pytest", help = "Run tests" } 33 | 34 | [tool.flake8] 35 | max-line-length = 88 36 | extend-ignore = "E203" 37 | 38 | [tool.isort] 39 | profile = "black" 40 | 41 | [tool.mypy] 42 | strict = true 43 | ignore_missing_imports = true 44 | disallow_untyped_decorators = false 45 | 46 | [tool.pytest.ini_options] 47 | testpaths = ["tests"] 48 | filterwarnings = ["ignore::DeprecationWarning"] 49 | 50 | [build-system] 51 | requires = ["poetry-core>=1.0"] 52 | build-backend = "poetry.core.masonry.api" 53 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | Before getting started, install [Poetry](https://python-poetry.org/docs/#installation). 4 | 5 | ## Getting Started 6 | 7 | To install the project: 8 | 9 | ```sh 10 | poetry install 11 | ``` 12 | 13 | Optionally, you can also install [pre-commit](https://pre-commit.com/) hooks: 14 | 15 | ```sh 16 | poetry run pre-commit install 17 | ``` 18 | 19 | Lastly, to see common tasks with [taskipy](https://github.com/illBeRoy/taskipy): 20 | 21 | ```sh 22 | poetry run task --list 23 | ``` 24 | 25 | ## Linting 26 | 27 | To ensure code quality, we use the following tools: 28 | 29 | - Formatting: [black](https://black.readthedocs.io/en/stable/) and [isort](https://isort.readthedocs.io/en/latest/) 30 | - Linting: [flake8](http://flake8.pycqa.org/en/latest/) 31 | - Type checking: [mypy](https://mypy.readthedocs.io/en/stable/) 32 | 33 | To run these: 34 | 35 | ```sh 36 | poetry run task lint 37 | ``` 38 | 39 | ## Testing 40 | 41 | To run tests via [pytest](https://docs.pytest.org/en/latest/): 42 | 43 | ```sh 44 | poetry run test 45 | ``` 46 | 47 | ## Releasing 48 | 49 | Releasing is fully automated via our [CI pipeline](.github/workflows/ci.yaml). On each commit to `main`, it will: 50 | 51 | 1. Lint and test the codebase 52 | 1. Determine if a new version should be released (using [conventional commits](https://www.conventionalcommits.org/)) 53 | 1. If so, bump the version and publish a new release 54 | 55 | To override this behavior, include `[cd skip]` in your commit message. 56 | -------------------------------------------------------------------------------- /src/pdm_publish/core.py: -------------------------------------------------------------------------------- 1 | from __future__ import annotations 2 | 3 | import subprocess 4 | import sys 5 | from dataclasses import dataclass 6 | from typing import Any 7 | 8 | from pdm import Project, termui 9 | 10 | 11 | def twine(*cmd: str, **kwargs: Any) -> subprocess.CompletedProcess[str]: 12 | return subprocess.run( 13 | [sys.executable, "-m", "twine", *cmd], capture_output=True, text=True, **kwargs 14 | ) 15 | 16 | 17 | @dataclass 18 | class Publisher: 19 | project: Project 20 | 21 | @property 22 | def ui(self) -> termui.UI: 23 | return self.project.core.ui # type: ignore 24 | 25 | @property 26 | def files(self) -> list[str]: 27 | dist = self.project.pyproject_file.parent / "dist" 28 | return [str(f) for g in {"*.whl", "*.tar.gz"} for f in dist.glob(g)] 29 | 30 | def publish( 31 | self, repo: str, username: str, password: str, dry_run: bool = False 32 | ) -> None: 33 | repo_flag_suffix = "" if repo.lower() in {"pypi", "testpypi"} else "-url" 34 | if not dry_run: 35 | with self.ui.open_spinner(f"Uploading to {repo}") as spin: 36 | resp = twine( 37 | "upload", 38 | "--non-interactive", 39 | f"--repository{repo_flag_suffix}", 40 | repo, 41 | "--username", 42 | username, 43 | *self.files, 44 | env={"TWINE_PASSWORD": password}, 45 | ) 46 | if resp.returncode: 47 | spin.fail("Publish failed") 48 | self.ui.echo(termui.red(resp.stderr), err=True) 49 | resp.check_returncode() 50 | else: 51 | spin.succeed("Publish successful") 52 | 53 | verb = "Uploaded" if not dry_run else "Would upload" 54 | self.ui.echo( 55 | f"{verb} {termui.cyan(self.project.meta.name)}" 56 | f" ({termui.bold(self.project.meta.version)}) to {repo}" 57 | ) 58 | -------------------------------------------------------------------------------- /tests/test_core.py: -------------------------------------------------------------------------------- 1 | import subprocess 2 | from subprocess import CompletedProcess 3 | from unittest.mock import MagicMock 4 | 5 | import pytest 6 | from pytest_mock import MockFixture 7 | 8 | from pdm_publish.core import Publisher 9 | 10 | 11 | @pytest.fixture 12 | def twine(mocker: MockFixture) -> MagicMock: 13 | return mocker.patch( 14 | "pdm_publish.core.twine", 15 | return_value=CompletedProcess(args="notused", returncode=0), 16 | ) 17 | 18 | 19 | def test_publisher_calls_twine(publisher: Publisher, twine: MagicMock) -> None: 20 | publisher.publish(repo="pypi", username="user", password="pass") 21 | twine.assert_called_once_with( 22 | "upload", 23 | "--non-interactive", 24 | "--repository", 25 | "pypi", 26 | "--username", 27 | "user", 28 | env={"TWINE_PASSWORD": "pass"}, 29 | ) 30 | 31 | 32 | @pytest.mark.parametrize("repo", ["pypi", "testpypi"]) 33 | def test_publisher_calls_twine_with_repo( 34 | publisher: Publisher, twine: MagicMock, repo: str 35 | ) -> None: 36 | publisher.publish(repo=repo, username="user", password="pass") 37 | assert "--repository" in twine.call_args[0] 38 | 39 | 40 | @pytest.mark.parametrize( 41 | "repo_url", ["https://upload.pypi.org/legacy/", "https://example.pypi.org/"] 42 | ) 43 | def test_publisher_calls_twine_with_repo_url( 44 | publisher: Publisher, twine: MagicMock, repo_url: str 45 | ) -> None: 46 | publisher.publish(repo=repo_url, username="user", password="pass") 47 | assert "--repository-url" in twine.call_args[0] 48 | 49 | 50 | def test_publisher_displays_stderr_on_twine_failure( 51 | publisher: Publisher, mocker: MockFixture, capsys: pytest.CaptureFixture[str] 52 | ) -> None: 53 | mocker.patch( 54 | "pdm_publish.core.twine", 55 | return_value=CompletedProcess( 56 | args="notused", returncode=1, stdout="out", stderr="err" 57 | ), 58 | ) 59 | with pytest.raises(subprocess.CalledProcessError): 60 | publisher.publish(repo="repo", username="user", password="pass") 61 | _, err = capsys.readouterr() 62 | assert err == "err\n" 63 | -------------------------------------------------------------------------------- /.github/workflows/ci.yaml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | branches: [main] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | if: "!contains(github.event.head_commit.message, 'ci skip')" 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-python@v2 16 | with: 17 | python-version: 3.9 18 | - name: Set up Poetry 19 | run: | 20 | pip install poetry 21 | poetry config virtualenvs.in-project true 22 | - name: Set up cache 23 | uses: actions/cache@v2 24 | with: 25 | path: .venv 26 | key: ${{ runner.os }}-venv-py3.9-${{ hashFiles('**/poetry.lock') }} 27 | - name: Install package 28 | run: poetry install 29 | - name: Run linters 30 | run: poetry run task lint 31 | - name: Run tests 32 | run: poetry run task test 33 | 34 | release: 35 | needs: build 36 | runs-on: ubuntu-latest 37 | if: github.ref == 'refs/heads/main' && !contains(github.event.head_commit.message, 'cd skip') 38 | steps: 39 | - uses: actions/checkout@v2 40 | - name: Bump version 41 | uses: TriPSs/conventional-changelog-action@v3 42 | id: version 43 | with: 44 | github-token: ${{ secrets.GITHUB_TOKEN }} 45 | git-user-name: "GitHub Actions" 46 | git-user-email: "action@github.com" 47 | version-file: pyproject.toml 48 | version-path: tool.poetry.version 49 | preset: conventionalcommits 50 | output-file: false 51 | - name: Publish to GitHub 52 | if: steps.version.outputs.skipped == 'false' 53 | run: gh release create "$TAG" --notes "$BODY" 54 | env: 55 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 56 | TAG: ${{ steps.version.outputs.tag }} 57 | BODY: ${{ steps.version.outputs.clean_changelog }} 58 | - name: Publish to PyPI 59 | if: steps.version.outputs.skipped == 'false' 60 | run: pip install poetry && poetry publish --build 61 | env: 62 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 63 | POETRY_PYPI_TOKEN_PYPI: ${{ secrets.PYPI_TOKEN }} 64 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Python ### 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | pip-wheel-metadata/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | pytestdebug.log 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | db.sqlite3-journal 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | doc/_build/ 76 | 77 | # PyBuilder 78 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 98 | __pypackages__/ 99 | 100 | # Celery stuff 101 | celerybeat-schedule 102 | celerybeat.pid 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | pythonenv* 116 | 117 | # Spyder project settings 118 | .spyderproject 119 | .spyproject 120 | 121 | # Rope project settings 122 | .ropeproject 123 | 124 | # mkdocs documentation 125 | /site 126 | 127 | # mypy 128 | .mypy_cache/ 129 | .dmypy.json 130 | dmypy.json 131 | 132 | # Pyre type checker 133 | .pyre/ 134 | 135 | # pytype static type analyzer 136 | .pytype/ 137 | 138 | # profiling data 139 | .prof 140 | 141 | .pdm.toml 142 | -------------------------------------------------------------------------------- /src/pdm_publish/command.py: -------------------------------------------------------------------------------- 1 | from argparse import ArgumentParser, Namespace 2 | from typing import Any 3 | 4 | import click 5 | from pdm import Project, termui 6 | from pdm.cli.actions import do_build 7 | from pdm.cli.commands.base import BaseCommand 8 | from pdm.exceptions import PdmUsageError 9 | 10 | from .core import Publisher 11 | 12 | 13 | class PublishCommand(BaseCommand): 14 | """Upload artifacts to a remote repository""" 15 | 16 | name = "publish" 17 | 18 | def add_arguments(self, parser: ArgumentParser) -> None: 19 | parser.add_argument( 20 | "-r", 21 | "--repository", 22 | help="The repository name or url to publish the package to" 23 | " [env var: PDM_PUBLISH_REPO]", 24 | ) 25 | parser.add_argument( 26 | "-u", 27 | "--username", 28 | help="The username to access the repository" 29 | " [env var: PDM_PUBLISH_USERNAME]", 30 | ) 31 | parser.add_argument( 32 | "-P", 33 | "--password", 34 | help="The password to access the repository" 35 | " [env var: PDM_PUBLISH_PASSWORD]", 36 | ) 37 | parser.add_argument( 38 | "--dry-run", 39 | action="store_true", 40 | help="Perform all actions except upload the package", 41 | ) 42 | parser.add_argument( 43 | "--no-build", 44 | action="store_false", 45 | dest="build", 46 | help="Don't build the package before publishing", 47 | ) 48 | 49 | def coalesce( 50 | self, project: Project, options: Namespace, key: str, **kwargs: Any 51 | ) -> str: 52 | value = getattr(options, key) or project.config.get(f"publish.{key}") 53 | if not value: 54 | value = click.prompt(key.capitalize(), **kwargs) 55 | return str(value) 56 | 57 | def handle(self, project: Project, options: Namespace) -> None: 58 | # Validation 59 | username = self.coalesce(project, options, "username") 60 | password = self.coalesce(project, options, "password", hide_input=True) 61 | 62 | # Build 63 | if options.build: 64 | do_build(project) 65 | 66 | # Check for files 67 | publisher = Publisher(project) 68 | if not publisher.files: 69 | raise PdmUsageError( 70 | f"No files to publish! Retry without {termui.bold('--no-build')}." 71 | ) 72 | 73 | # Publish 74 | publisher.publish( 75 | repo=options.repository or project.config["publish.repo"], 76 | username=username, 77 | password=password, 78 | dry_run=options.dry_run, 79 | ) 80 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PDM Publish 2 | 3 | > [!CAUTION] 4 | > This repository is archived as a `publish` command was natively integrated into [pdm 2.0](https://github.com/pdm-project/pdm/commit/c1b7d312c9695da9c0203b36a6fb70138f61ea43). 5 | 6 | [![ci](https://github.com/branchv/pdm-publish/workflows/CI/badge.svg)](https://github.com/branchv/pdm-publish/actions/workflows/ci.yaml) 7 | [![pypi version](https://img.shields.io/pypi/v/pdm-publish.svg)](https://pypi.org/project/pdm-publish/) 8 | [![code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) 9 | [![checked with mypy](http://www.mypy-lang.org/static/mypy_badge.svg)](http://mypy-lang.org/) 10 | 11 | A PDM plugin to publish to PyPI 12 | 13 | ## Installation 14 | 15 | With `pdm` 1.6.4+: 16 | 17 | ```sh 18 | pdm plugin add pdm-publish 19 | ``` 20 | 21 | Otherwise, installation depends on how `pdm` was installed: 22 | 23 |
24 | pipx 25 | 26 | ```sh 27 | pipx inject pdm pdm-publish 28 | ``` 29 | 30 |
31 | 32 |
33 | brew 34 | 35 | ```sh 36 | $(brew --prefix pdm)/libexec/bin/python -m pip install pdm-publish 37 | ``` 38 | 39 |
40 | 41 |
42 | pip 43 | 44 | ```sh 45 | pip install --user pdm-publish 46 | ``` 47 | 48 |
49 | 50 | ## Usage 51 | 52 | `pdm-publish` enables `pdm` to publish packages to PyPI by wrapping [twine](https://twine.readthedocs.io/en/latest/) internally. 53 | For example, to build and publish: 54 | 55 | ```sh 56 | # Using token auth 57 | pdm publish --password token 58 | # To test PyPI using basic auth 59 | pdm publish -r testpypi -u username -P password 60 | # To custom index 61 | pdm publish -r https://custom.index.com/ 62 | ``` 63 | 64 | Full usage: 65 | 66 | ```sh 67 | $ pdm publish --help 68 | Upload artifacts to a remote repository 69 | 70 | Usage: 71 | 72 | Options: 73 | -h, --help show this help message and exit 74 | -v, --verbose -v for detailed output and -vv for more detailed 75 | -g, --global Use the global project, supply the project root with 76 | `-p` option 77 | -p PROJECT_PATH, --project PROJECT_PATH 78 | Specify another path as the project root, which 79 | changes the base of pyproject.toml and __pypackages__ 80 | -r REPOSITORY, --repository REPOSITORY 81 | The repository name or url to publish the package to 82 | [env var: PDM_PUBLISH_REPO] 83 | -u USERNAME, --username USERNAME 84 | The username to access the repository [env var: 85 | PDM_PUBLISH_USERNAME] 86 | -P PASSWORD, --password PASSWORD 87 | The password to access the repository [env var: 88 | PDM_PUBLISH_PASSWORD] 89 | --dry-run Perform all actions except upload the package 90 | --no-build Don't build the package before publishing 91 | ``` 92 | 93 | ## Configuration 94 | 95 | | Config Item | Description | Default Value | Available in Project | Env var | 96 | | ------------------ | ------------------------------------- | ------------- | -------------------- | ---------------------- | 97 | | `publish.repo` | PyPI repo name (pypi/testpypi) or url | `pypi` | True | `PDM_PUBLISH_REPO` | 98 | | `publish.username` | PyPI username | `__token__` | True | `PDM_PUBLISH_USERNAME` | 99 | | `publish.password` | PyPI password | | True | `PDM_PUBLISH_PASSWORD` | 100 | 101 | ## Links 102 | 103 | - [Changelog](https://github.com/branchv/pdm-publish/releases) 104 | - [Contributing](CONTRIBUTING.md) 105 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "appdirs" 3 | version = "1.4.4" 4 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 5 | category = "main" 6 | optional = false 7 | python-versions = "*" 8 | 9 | [[package]] 10 | name = "atomicwrites" 11 | version = "1.4.0" 12 | description = "Atomic file writes." 13 | category = "dev" 14 | optional = false 15 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 16 | 17 | [[package]] 18 | name = "atoml" 19 | version = "1.0.2" 20 | description = "Yet another style preserving TOML library" 21 | category = "main" 22 | optional = false 23 | python-versions = ">=3.6" 24 | 25 | [[package]] 26 | name = "attrs" 27 | version = "21.2.0" 28 | description = "Classes Without Boilerplate" 29 | category = "main" 30 | optional = false 31 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 32 | 33 | [package.extras] 34 | 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"] 35 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 36 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 37 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 38 | 39 | [[package]] 40 | name = "black" 41 | version = "21.6b0" 42 | description = "The uncompromising code formatter." 43 | category = "dev" 44 | optional = false 45 | python-versions = ">=3.6.2" 46 | 47 | [package.dependencies] 48 | appdirs = "*" 49 | click = ">=7.1.2" 50 | mypy-extensions = ">=0.4.3" 51 | pathspec = ">=0.8.1,<1" 52 | regex = ">=2020.1.8" 53 | toml = ">=0.10.1" 54 | typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} 55 | typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} 56 | 57 | [package.extras] 58 | colorama = ["colorama (>=0.4.3)"] 59 | d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] 60 | python2 = ["typed-ast (>=1.4.2)"] 61 | uvloop = ["uvloop (>=0.15.2)"] 62 | 63 | [[package]] 64 | name = "bleach" 65 | version = "3.3.0" 66 | description = "An easy safelist-based HTML-sanitizing tool." 67 | category = "main" 68 | optional = false 69 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 70 | 71 | [package.dependencies] 72 | packaging = "*" 73 | six = ">=1.9.0" 74 | webencodings = "*" 75 | 76 | [[package]] 77 | name = "cached-property" 78 | version = "1.5.2" 79 | description = "A decorator for caching properties in classes." 80 | category = "main" 81 | optional = false 82 | python-versions = "*" 83 | 84 | [[package]] 85 | name = "certifi" 86 | version = "2021.5.30" 87 | description = "Python package for providing Mozilla's CA Bundle." 88 | category = "main" 89 | optional = false 90 | python-versions = "*" 91 | 92 | [[package]] 93 | name = "cffi" 94 | version = "1.14.6" 95 | description = "Foreign Function Interface for Python calling C code." 96 | category = "main" 97 | optional = false 98 | python-versions = "*" 99 | 100 | [package.dependencies] 101 | pycparser = "*" 102 | 103 | [[package]] 104 | name = "cfgv" 105 | version = "3.3.0" 106 | description = "Validate configuration and produce human readable error messages." 107 | category = "dev" 108 | optional = false 109 | python-versions = ">=3.6.1" 110 | 111 | [[package]] 112 | name = "chardet" 113 | version = "4.0.0" 114 | description = "Universal encoding detector for Python 2 and 3" 115 | category = "main" 116 | optional = false 117 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 118 | 119 | [[package]] 120 | name = "click" 121 | version = "8.0.1" 122 | description = "Composable command line interface toolkit" 123 | category = "main" 124 | optional = false 125 | python-versions = ">=3.6" 126 | 127 | [package.dependencies] 128 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 129 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 130 | 131 | [[package]] 132 | name = "colorama" 133 | version = "0.4.4" 134 | description = "Cross-platform colored terminal text." 135 | category = "main" 136 | optional = false 137 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 138 | 139 | [[package]] 140 | name = "cryptography" 141 | version = "3.4.7" 142 | description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." 143 | category = "main" 144 | optional = false 145 | python-versions = ">=3.6" 146 | 147 | [package.dependencies] 148 | cffi = ">=1.12" 149 | 150 | [package.extras] 151 | docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] 152 | docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] 153 | pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] 154 | sdist = ["setuptools-rust (>=0.11.4)"] 155 | ssh = ["bcrypt (>=3.1.5)"] 156 | test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] 157 | 158 | [[package]] 159 | name = "distlib" 160 | version = "0.3.2" 161 | description = "Distribution utilities" 162 | category = "main" 163 | optional = false 164 | python-versions = "*" 165 | 166 | [[package]] 167 | name = "docutils" 168 | version = "0.17.1" 169 | description = "Docutils -- Python Documentation Utilities" 170 | category = "main" 171 | optional = false 172 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 173 | 174 | [[package]] 175 | name = "filelock" 176 | version = "3.0.12" 177 | description = "A platform independent file lock." 178 | category = "dev" 179 | optional = false 180 | python-versions = "*" 181 | 182 | [[package]] 183 | name = "flake8" 184 | version = "3.9.2" 185 | description = "the modular source code checker: pep8 pyflakes and co" 186 | category = "dev" 187 | optional = false 188 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 189 | 190 | [package.dependencies] 191 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 192 | mccabe = ">=0.6.0,<0.7.0" 193 | pycodestyle = ">=2.7.0,<2.8.0" 194 | pyflakes = ">=2.3.0,<2.4.0" 195 | 196 | [[package]] 197 | name = "identify" 198 | version = "2.2.11" 199 | description = "File identification library for Python" 200 | category = "dev" 201 | optional = false 202 | python-versions = ">=3.6.1" 203 | 204 | [package.extras] 205 | license = ["editdistance-s"] 206 | 207 | [[package]] 208 | name = "idna" 209 | version = "2.10" 210 | description = "Internationalized Domain Names in Applications (IDNA)" 211 | category = "main" 212 | optional = false 213 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 214 | 215 | [[package]] 216 | name = "importlib-metadata" 217 | version = "4.6.1" 218 | description = "Read metadata from Python packages" 219 | category = "main" 220 | optional = false 221 | python-versions = ">=3.6" 222 | 223 | [package.dependencies] 224 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 225 | zipp = ">=0.5" 226 | 227 | [package.extras] 228 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 229 | perf = ["ipython"] 230 | 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)"] 231 | 232 | [[package]] 233 | name = "iniconfig" 234 | version = "1.1.1" 235 | description = "iniconfig: brain-dead simple config-ini parsing" 236 | category = "dev" 237 | optional = false 238 | python-versions = "*" 239 | 240 | [[package]] 241 | name = "isort" 242 | version = "5.9.2" 243 | description = "A Python utility / library to sort Python imports." 244 | category = "dev" 245 | optional = false 246 | python-versions = ">=3.6.1,<4.0" 247 | 248 | [package.extras] 249 | pipfile_deprecated_finder = ["pipreqs", "requirementslib"] 250 | requirements_deprecated_finder = ["pipreqs", "pip-api"] 251 | colors = ["colorama (>=0.4.3,<0.5.0)"] 252 | plugins = ["setuptools"] 253 | 254 | [[package]] 255 | name = "jeepney" 256 | version = "0.7.0" 257 | description = "Low-level, pure Python DBus protocol wrapper." 258 | category = "main" 259 | optional = false 260 | python-versions = ">=3.6" 261 | 262 | [package.extras] 263 | test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] 264 | trio = ["trio", "async-generator"] 265 | 266 | [[package]] 267 | name = "keyring" 268 | version = "23.0.1" 269 | description = "Store and access your passwords safely." 270 | category = "main" 271 | optional = false 272 | python-versions = ">=3.6" 273 | 274 | [package.dependencies] 275 | importlib-metadata = ">=3.6" 276 | jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} 277 | pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} 278 | SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} 279 | 280 | [package.extras] 281 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 282 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] 283 | 284 | [[package]] 285 | name = "mccabe" 286 | version = "0.6.1" 287 | description = "McCabe checker, plugin for flake8" 288 | category = "dev" 289 | optional = false 290 | python-versions = "*" 291 | 292 | [[package]] 293 | name = "mslex" 294 | version = "0.3.0" 295 | description = "shlex for windows" 296 | category = "dev" 297 | optional = false 298 | python-versions = ">=3.5" 299 | 300 | [[package]] 301 | name = "mypy" 302 | version = "0.910" 303 | description = "Optional static typing for Python" 304 | category = "dev" 305 | optional = false 306 | python-versions = ">=3.5" 307 | 308 | [package.dependencies] 309 | mypy-extensions = ">=0.4.3,<0.5.0" 310 | toml = "*" 311 | typed-ast = {version = ">=1.4.0,<1.5.0", markers = "python_version < \"3.8\""} 312 | typing-extensions = ">=3.7.4" 313 | 314 | [package.extras] 315 | dmypy = ["psutil (>=4.0)"] 316 | python2 = ["typed-ast (>=1.4.0,<1.5.0)"] 317 | 318 | [[package]] 319 | name = "mypy-extensions" 320 | version = "0.4.3" 321 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 322 | category = "dev" 323 | optional = false 324 | python-versions = "*" 325 | 326 | [[package]] 327 | name = "nodeenv" 328 | version = "1.6.0" 329 | description = "Node.js virtual environment builder" 330 | category = "dev" 331 | optional = false 332 | python-versions = "*" 333 | 334 | [[package]] 335 | name = "packaging" 336 | version = "21.0" 337 | description = "Core utilities for Python packages" 338 | category = "main" 339 | optional = false 340 | python-versions = ">=3.6" 341 | 342 | [package.dependencies] 343 | pyparsing = ">=2.0.2" 344 | 345 | [[package]] 346 | name = "pathspec" 347 | version = "0.8.1" 348 | description = "Utility library for gitignore style pattern matching of file paths." 349 | category = "dev" 350 | optional = false 351 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 352 | 353 | [[package]] 354 | name = "pdm" 355 | version = "1.6.4" 356 | description = "Python Development Master" 357 | category = "main" 358 | optional = false 359 | python-versions = ">=3.7" 360 | 361 | [package.dependencies] 362 | appdirs = "*" 363 | atoml = ">=1.0,<2.0" 364 | click = ">=7" 365 | distlib = ">=0.3.1" 366 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 367 | pdm-pep517 = ">=0.7.0,<0.8.0" 368 | pep517 = "*" 369 | python-cfonts = "*" 370 | python-dotenv = ">=0.15.0,<1.0.0" 371 | pythonfinder = "*" 372 | resolvelib = ">=0.7.0,<0.8.0" 373 | shellingham = ">=1.3.2,<2.0.0" 374 | 375 | [[package]] 376 | name = "pdm-pep517" 377 | version = "0.7.4" 378 | description = "A PEP 517 backend for PDM that supports PEP 621 metadata" 379 | category = "main" 380 | optional = false 381 | python-versions = ">=3.6" 382 | 383 | [[package]] 384 | name = "pep517" 385 | version = "0.10.0" 386 | description = "Wrappers to build Python packages using PEP 517 hooks" 387 | category = "main" 388 | optional = false 389 | python-versions = "*" 390 | 391 | [package.dependencies] 392 | importlib_metadata = {version = "*", markers = "python_version < \"3.8\""} 393 | toml = "*" 394 | zipp = {version = "*", markers = "python_version < \"3.8\""} 395 | 396 | [[package]] 397 | name = "pkginfo" 398 | version = "1.7.1" 399 | description = "Query metadatdata from sdists / bdists / installed packages." 400 | category = "main" 401 | optional = false 402 | python-versions = "*" 403 | 404 | [package.extras] 405 | testing = ["nose", "coverage"] 406 | 407 | [[package]] 408 | name = "pluggy" 409 | version = "0.13.1" 410 | description = "plugin and hook calling mechanisms for python" 411 | category = "dev" 412 | optional = false 413 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 414 | 415 | [package.dependencies] 416 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 417 | 418 | [package.extras] 419 | dev = ["pre-commit", "tox"] 420 | 421 | [[package]] 422 | name = "pre-commit" 423 | version = "2.13.0" 424 | description = "A framework for managing and maintaining multi-language pre-commit hooks." 425 | category = "dev" 426 | optional = false 427 | python-versions = ">=3.6.1" 428 | 429 | [package.dependencies] 430 | cfgv = ">=2.0.0" 431 | identify = ">=1.0.0" 432 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 433 | nodeenv = ">=0.11.1" 434 | pyyaml = ">=5.1" 435 | toml = "*" 436 | virtualenv = ">=20.0.8" 437 | 438 | [[package]] 439 | name = "psutil" 440 | version = "5.8.0" 441 | description = "Cross-platform lib for process and system monitoring in Python." 442 | category = "dev" 443 | optional = false 444 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 445 | 446 | [package.extras] 447 | test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] 448 | 449 | [[package]] 450 | name = "py" 451 | version = "1.10.0" 452 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 453 | category = "dev" 454 | optional = false 455 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 456 | 457 | [[package]] 458 | name = "pycodestyle" 459 | version = "2.7.0" 460 | description = "Python style guide checker" 461 | category = "dev" 462 | optional = false 463 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 464 | 465 | [[package]] 466 | name = "pycparser" 467 | version = "2.20" 468 | description = "C parser in Python" 469 | category = "main" 470 | optional = false 471 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 472 | 473 | [[package]] 474 | name = "pyflakes" 475 | version = "2.3.1" 476 | description = "passive checker of Python programs" 477 | category = "dev" 478 | optional = false 479 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 480 | 481 | [[package]] 482 | name = "pygments" 483 | version = "2.9.0" 484 | description = "Pygments is a syntax highlighting package written in Python." 485 | category = "main" 486 | optional = false 487 | python-versions = ">=3.5" 488 | 489 | [[package]] 490 | name = "pyparsing" 491 | version = "2.4.7" 492 | description = "Python parsing module" 493 | category = "main" 494 | optional = false 495 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 496 | 497 | [[package]] 498 | name = "pyproject-flake8" 499 | version = "0.0.1a2" 500 | description = "pyproject-flake8 (`pflake8`), a monkey patching wrapper to connect flake8 with pyproject.toml configuration" 501 | category = "dev" 502 | optional = false 503 | python-versions = "*" 504 | 505 | [package.dependencies] 506 | flake8 = "*" 507 | toml = "*" 508 | 509 | [[package]] 510 | name = "pytest" 511 | version = "6.2.4" 512 | description = "pytest: simple powerful testing with Python" 513 | category = "dev" 514 | optional = false 515 | python-versions = ">=3.6" 516 | 517 | [package.dependencies] 518 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 519 | attrs = ">=19.2.0" 520 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 521 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 522 | iniconfig = "*" 523 | packaging = "*" 524 | pluggy = ">=0.12,<1.0.0a1" 525 | py = ">=1.8.2" 526 | toml = "*" 527 | 528 | [package.extras] 529 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 530 | 531 | [[package]] 532 | name = "pytest-mock" 533 | version = "3.6.1" 534 | description = "Thin-wrapper around the mock package for easier use with pytest" 535 | category = "dev" 536 | optional = false 537 | python-versions = ">=3.6" 538 | 539 | [package.dependencies] 540 | pytest = ">=5.0" 541 | 542 | [package.extras] 543 | dev = ["pre-commit", "tox", "pytest-asyncio"] 544 | 545 | [[package]] 546 | name = "python-cfonts" 547 | version = "1.5.2" 548 | description = "Sexy fonts for the console" 549 | category = "main" 550 | optional = false 551 | python-versions = ">=3.6" 552 | 553 | [package.dependencies] 554 | colorama = "*" 555 | 556 | [[package]] 557 | name = "python-dotenv" 558 | version = "0.18.0" 559 | description = "Read key-value pairs from a .env file and set them as environment variables" 560 | category = "main" 561 | optional = false 562 | python-versions = "*" 563 | 564 | [package.extras] 565 | cli = ["click (>=5.0)"] 566 | 567 | [[package]] 568 | name = "pythonfinder" 569 | version = "1.2.7" 570 | description = "A cross-platform python discovery tool to help locate python on any system." 571 | category = "main" 572 | optional = false 573 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 574 | 575 | [package.dependencies] 576 | attrs = "*" 577 | cached-property = "*" 578 | click = "*" 579 | packaging = "*" 580 | six = "*" 581 | 582 | [package.extras] 583 | dev = ["parver", "wheel (>=0.33.4)", "invoke", "twine", "lxml", "flake8", "rope", "pre-commit", "isort", "towncrier", "sphinx-click", "sphinx-rtd-theme", "sphinx-autodoc-types (<3)", "flake8-bugbear", "black"] 584 | tests = ["pytest", "pytest-cov", "pytest-timeout", "coverage (<5)", "twine", "readme-renderer"] 585 | typing = ["mypy-extensions", "mypy", "mypytools", "typed-ast", "monkeytype", "pytype"] 586 | 587 | [[package]] 588 | name = "pywin32-ctypes" 589 | version = "0.2.0" 590 | description = "" 591 | category = "main" 592 | optional = false 593 | python-versions = "*" 594 | 595 | [[package]] 596 | name = "pyyaml" 597 | version = "5.4.1" 598 | description = "YAML parser and emitter for Python" 599 | category = "dev" 600 | optional = false 601 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 602 | 603 | [[package]] 604 | name = "readme-renderer" 605 | version = "29.0" 606 | description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" 607 | category = "main" 608 | optional = false 609 | python-versions = "*" 610 | 611 | [package.dependencies] 612 | bleach = ">=2.1.0" 613 | docutils = ">=0.13.1" 614 | Pygments = ">=2.5.1" 615 | six = "*" 616 | 617 | [package.extras] 618 | md = ["cmarkgfm (>=0.5.0,<0.6.0)"] 619 | 620 | [[package]] 621 | name = "regex" 622 | version = "2021.7.6" 623 | description = "Alternative regular expression module, to replace re." 624 | category = "dev" 625 | optional = false 626 | python-versions = "*" 627 | 628 | [[package]] 629 | name = "requests" 630 | version = "2.25.1" 631 | description = "Python HTTP for Humans." 632 | category = "main" 633 | optional = false 634 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 635 | 636 | [package.dependencies] 637 | certifi = ">=2017.4.17" 638 | chardet = ">=3.0.2,<5" 639 | idna = ">=2.5,<3" 640 | urllib3 = ">=1.21.1,<1.27" 641 | 642 | [package.extras] 643 | security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] 644 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 645 | 646 | [[package]] 647 | name = "requests-toolbelt" 648 | version = "0.9.1" 649 | description = "A utility belt for advanced users of python-requests" 650 | category = "main" 651 | optional = false 652 | python-versions = "*" 653 | 654 | [package.dependencies] 655 | requests = ">=2.0.1,<3.0.0" 656 | 657 | [[package]] 658 | name = "resolvelib" 659 | version = "0.7.1" 660 | description = "Resolve abstract dependencies into concrete ones" 661 | category = "main" 662 | optional = false 663 | python-versions = "*" 664 | 665 | [package.extras] 666 | examples = ["html5lib", "packaging", "pygraphviz", "requests"] 667 | lint = ["black", "flake8"] 668 | release = ["setl", "towncrier"] 669 | test = ["commentjson", "packaging", "pytest"] 670 | 671 | [[package]] 672 | name = "rfc3986" 673 | version = "1.5.0" 674 | description = "Validating URI References per RFC 3986" 675 | category = "main" 676 | optional = false 677 | python-versions = "*" 678 | 679 | [package.extras] 680 | idna2008 = ["idna"] 681 | 682 | [[package]] 683 | name = "secretstorage" 684 | version = "3.3.1" 685 | description = "Python bindings to FreeDesktop.org Secret Service API" 686 | category = "main" 687 | optional = false 688 | python-versions = ">=3.6" 689 | 690 | [package.dependencies] 691 | cryptography = ">=2.0" 692 | jeepney = ">=0.6" 693 | 694 | [[package]] 695 | name = "shellingham" 696 | version = "1.4.0" 697 | description = "Tool to Detect Surrounding Shell" 698 | category = "main" 699 | optional = false 700 | python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" 701 | 702 | [[package]] 703 | name = "six" 704 | version = "1.16.0" 705 | description = "Python 2 and 3 compatibility utilities" 706 | category = "main" 707 | optional = false 708 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 709 | 710 | [[package]] 711 | name = "taskipy" 712 | version = "1.8.1" 713 | description = "tasks runner for python projects" 714 | category = "dev" 715 | optional = false 716 | python-versions = ">=3.6,<4.0" 717 | 718 | [package.dependencies] 719 | colorama = ">=0.4.4,<0.5.0" 720 | mslex = ">=0.3.0,<0.4.0" 721 | psutil = ">=5.7.2,<6.0.0" 722 | toml = ">=0.10.0,<0.11.0" 723 | 724 | [[package]] 725 | name = "toml" 726 | version = "0.10.2" 727 | description = "Python Library for Tom's Obvious, Minimal Language" 728 | category = "main" 729 | optional = false 730 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 731 | 732 | [[package]] 733 | name = "tqdm" 734 | version = "4.61.2" 735 | description = "Fast, Extensible Progress Meter" 736 | category = "main" 737 | optional = false 738 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 739 | 740 | [package.dependencies] 741 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 742 | 743 | [package.extras] 744 | dev = ["py-make (>=0.1.0)", "twine", "wheel"] 745 | notebook = ["ipywidgets (>=6)"] 746 | telegram = ["requests"] 747 | 748 | [[package]] 749 | name = "twine" 750 | version = "3.4.1" 751 | description = "Collection of utilities for publishing packages on PyPI" 752 | category = "main" 753 | optional = false 754 | python-versions = ">=3.6" 755 | 756 | [package.dependencies] 757 | colorama = ">=0.4.3" 758 | importlib-metadata = ">=3.6" 759 | keyring = ">=15.1" 760 | pkginfo = ">=1.4.2" 761 | readme-renderer = ">=21.0" 762 | requests = ">=2.20" 763 | requests-toolbelt = ">=0.8.0,<0.9.0 || >0.9.0" 764 | rfc3986 = ">=1.4.0" 765 | tqdm = ">=4.14" 766 | 767 | [[package]] 768 | name = "typed-ast" 769 | version = "1.4.3" 770 | description = "a fork of Python 2 and 3 ast modules with type comment support" 771 | category = "dev" 772 | optional = false 773 | python-versions = "*" 774 | 775 | [[package]] 776 | name = "typing-extensions" 777 | version = "3.10.0.0" 778 | description = "Backported and Experimental Type Hints for Python 3.5+" 779 | category = "main" 780 | optional = false 781 | python-versions = "*" 782 | 783 | [[package]] 784 | name = "urllib3" 785 | version = "1.26.6" 786 | description = "HTTP library with thread-safe connection pooling, file post, and more." 787 | category = "main" 788 | optional = false 789 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 790 | 791 | [package.extras] 792 | brotli = ["brotlipy (>=0.6.0)"] 793 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 794 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 795 | 796 | [[package]] 797 | name = "virtualenv" 798 | version = "20.4.7" 799 | description = "Virtual Python Environment builder" 800 | category = "dev" 801 | optional = false 802 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 803 | 804 | [package.dependencies] 805 | appdirs = ">=1.4.3,<2" 806 | distlib = ">=0.3.1,<1" 807 | filelock = ">=3.0.0,<4" 808 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 809 | six = ">=1.9.0,<2" 810 | 811 | [package.extras] 812 | docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] 813 | testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] 814 | 815 | [[package]] 816 | name = "webencodings" 817 | version = "0.5.1" 818 | description = "Character encoding aliases for legacy web content" 819 | category = "main" 820 | optional = false 821 | python-versions = "*" 822 | 823 | [[package]] 824 | name = "zipp" 825 | version = "3.5.0" 826 | description = "Backport of pathlib-compatible object wrapper for zip files" 827 | category = "main" 828 | optional = false 829 | python-versions = ">=3.6" 830 | 831 | [package.extras] 832 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 833 | 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"] 834 | 835 | [metadata] 836 | lock-version = "1.1" 837 | python-versions = "^3.7" 838 | content-hash = "3da4271eaf005119cc0047b7f93334d66fef0bab4b3401d6efd78ec79cab2d9a" 839 | 840 | [metadata.files] 841 | appdirs = [ 842 | {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, 843 | {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, 844 | ] 845 | atomicwrites = [ 846 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 847 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 848 | ] 849 | atoml = [ 850 | {file = "atoml-1.0.2-py3-none-any.whl", hash = "sha256:89fd71a33f233da040d2ffdddd6f72a03771131c2ddacf9becb4ac0b2860471f"}, 851 | {file = "atoml-1.0.2.tar.gz", hash = "sha256:6bb0c219304ad63b0a567227ad34ccfd56c197fafed3120d4eca720b885397a0"}, 852 | ] 853 | attrs = [ 854 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 855 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 856 | ] 857 | black = [ 858 | {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, 859 | {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, 860 | ] 861 | bleach = [ 862 | {file = "bleach-3.3.0-py2.py3-none-any.whl", hash = "sha256:6123ddc1052673e52bab52cdc955bcb57a015264a1c57d37bea2f6b817af0125"}, 863 | {file = "bleach-3.3.0.tar.gz", hash = "sha256:98b3170739e5e83dd9dc19633f074727ad848cbedb6026708c8ac2d3b697a433"}, 864 | ] 865 | cached-property = [ 866 | {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, 867 | {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, 868 | ] 869 | certifi = [ 870 | {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, 871 | {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, 872 | ] 873 | cffi = [ 874 | {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, 875 | {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, 876 | {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, 877 | {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, 878 | {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, 879 | {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, 880 | {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, 881 | {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, 882 | {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, 883 | {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, 884 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, 885 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, 886 | {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, 887 | {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, 888 | {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, 889 | {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, 890 | {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, 891 | {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, 892 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, 893 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, 894 | {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, 895 | {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, 896 | {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, 897 | {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, 898 | {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, 899 | {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, 900 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, 901 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, 902 | {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, 903 | {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, 904 | {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, 905 | {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, 906 | {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, 907 | {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, 908 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, 909 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, 910 | {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, 911 | {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, 912 | {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, 913 | {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, 914 | ] 915 | cfgv = [ 916 | {file = "cfgv-3.3.0-py2.py3-none-any.whl", hash = "sha256:b449c9c6118fe8cca7fa5e00b9ec60ba08145d281d52164230a69211c5d597a1"}, 917 | {file = "cfgv-3.3.0.tar.gz", hash = "sha256:9e600479b3b99e8af981ecdfc80a0296104ee610cab48a5ae4ffd0b668650eb1"}, 918 | ] 919 | chardet = [ 920 | {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, 921 | {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, 922 | ] 923 | click = [ 924 | {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, 925 | {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, 926 | ] 927 | colorama = [ 928 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 929 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 930 | ] 931 | cryptography = [ 932 | {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, 933 | {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, 934 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, 935 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, 936 | {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, 937 | {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, 938 | {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, 939 | {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, 940 | {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, 941 | {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, 942 | {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, 943 | {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, 944 | ] 945 | distlib = [ 946 | {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"}, 947 | {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"}, 948 | ] 949 | docutils = [ 950 | {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, 951 | {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, 952 | ] 953 | filelock = [ 954 | {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, 955 | {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, 956 | ] 957 | flake8 = [ 958 | {file = "flake8-3.9.2-py2.py3-none-any.whl", hash = "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907"}, 959 | {file = "flake8-3.9.2.tar.gz", hash = "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b"}, 960 | ] 961 | identify = [ 962 | {file = "identify-2.2.11-py2.py3-none-any.whl", hash = "sha256:7abaecbb414e385752e8ce02d8c494f4fbc780c975074b46172598a28f1ab839"}, 963 | {file = "identify-2.2.11.tar.gz", hash = "sha256:a0e700637abcbd1caae58e0463861250095dfe330a8371733a471af706a4a29a"}, 964 | ] 965 | idna = [ 966 | {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, 967 | {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, 968 | ] 969 | importlib-metadata = [ 970 | {file = "importlib_metadata-4.6.1-py3-none-any.whl", hash = "sha256:9f55f560e116f8643ecf2922d9cd3e1c7e8d52e683178fecd9d08f6aa357e11e"}, 971 | {file = "importlib_metadata-4.6.1.tar.gz", hash = "sha256:079ada16b7fc30dfbb5d13399a5113110dab1aa7c2bc62f66af75f0b717c8cac"}, 972 | ] 973 | iniconfig = [ 974 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 975 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 976 | ] 977 | isort = [ 978 | {file = "isort-5.9.2-py3-none-any.whl", hash = "sha256:eed17b53c3e7912425579853d078a0832820f023191561fcee9d7cae424e0813"}, 979 | {file = "isort-5.9.2.tar.gz", hash = "sha256:f65ce5bd4cbc6abdfbe29afc2f0245538ab358c14590912df638033f157d555e"}, 980 | ] 981 | jeepney = [ 982 | {file = "jeepney-0.7.0-py3-none-any.whl", hash = "sha256:71335e7a4e93817982f473f3507bffc2eff7a544119ab9b73e089c8ba1409ba3"}, 983 | {file = "jeepney-0.7.0.tar.gz", hash = "sha256:1237cd64c8f7ac3aa4b3f332c4d0fb4a8216f39eaa662ec904302d4d77de5a54"}, 984 | ] 985 | keyring = [ 986 | {file = "keyring-23.0.1-py3-none-any.whl", hash = "sha256:8f607d7d1cc502c43a932a275a56fe47db50271904513a379d39df1af277ac48"}, 987 | {file = "keyring-23.0.1.tar.gz", hash = "sha256:045703609dd3fccfcdb27da201684278823b72af515aedec1a8515719a038cb8"}, 988 | ] 989 | mccabe = [ 990 | {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, 991 | {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, 992 | ] 993 | mslex = [ 994 | {file = "mslex-0.3.0-py2.py3-none-any.whl", hash = "sha256:380cb14abf8fabf40e56df5c8b21a6d533dc5cbdcfe42406bbf08dda8f42e42a"}, 995 | {file = "mslex-0.3.0.tar.gz", hash = "sha256:4a1ac3f25025cad78ad2fe499dd16d42759f7a3801645399cce5c404415daa97"}, 996 | ] 997 | mypy = [ 998 | {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"}, 999 | {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"}, 1000 | {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"}, 1001 | {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"}, 1002 | {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"}, 1003 | {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"}, 1004 | {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"}, 1005 | {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"}, 1006 | {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"}, 1007 | {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"}, 1008 | {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"}, 1009 | {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"}, 1010 | {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"}, 1011 | {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"}, 1012 | {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"}, 1013 | {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"}, 1014 | {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"}, 1015 | {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"}, 1016 | {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"}, 1017 | {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"}, 1018 | {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"}, 1019 | {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"}, 1020 | {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"}, 1021 | ] 1022 | mypy-extensions = [ 1023 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1024 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1025 | ] 1026 | nodeenv = [ 1027 | {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, 1028 | {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, 1029 | ] 1030 | packaging = [ 1031 | {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, 1032 | {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, 1033 | ] 1034 | pathspec = [ 1035 | {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, 1036 | {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, 1037 | ] 1038 | pdm = [ 1039 | {file = "pdm-1.6.4-py3-none-any.whl", hash = "sha256:b621252712e11e0d81c720dc422db0c547e56d92f8bcfaf1af6dcc7e2025e74a"}, 1040 | {file = "pdm-1.6.4.tar.gz", hash = "sha256:6c3ab53fba8fa33811fd1c3cf4652f05d0081f5e3c2885b8690c874c8d77c999"}, 1041 | ] 1042 | pdm-pep517 = [ 1043 | {file = "pdm-pep517-0.7.4.tar.gz", hash = "sha256:538409c63131d6c52ce8dc7dd3d78a033dcdad07f1c71f542add77e70fa9cb55"}, 1044 | {file = "pdm_pep517-0.7.4-py3-none-any.whl", hash = "sha256:1e9b1eeddc9ab208f44dac18a3192eadb8b7a431aa50f707e6bdb5e353bd40f9"}, 1045 | ] 1046 | pep517 = [ 1047 | {file = "pep517-0.10.0-py2.py3-none-any.whl", hash = "sha256:eba39d201ef937584ad3343df3581069085bacc95454c80188291d5b3ac7a249"}, 1048 | {file = "pep517-0.10.0.tar.gz", hash = "sha256:ac59f3f6b9726a49e15a649474539442cf76e0697e39df4869d25e68e880931b"}, 1049 | ] 1050 | pkginfo = [ 1051 | {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, 1052 | {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, 1053 | ] 1054 | pluggy = [ 1055 | {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, 1056 | {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, 1057 | ] 1058 | pre-commit = [ 1059 | {file = "pre_commit-2.13.0-py2.py3-none-any.whl", hash = "sha256:b679d0fddd5b9d6d98783ae5f10fd0c4c59954f375b70a58cbe1ce9bcf9809a4"}, 1060 | {file = "pre_commit-2.13.0.tar.gz", hash = "sha256:764972c60693dc668ba8e86eb29654ec3144501310f7198742a767bec385a378"}, 1061 | ] 1062 | psutil = [ 1063 | {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, 1064 | {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, 1065 | {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, 1066 | {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, 1067 | {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, 1068 | {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, 1069 | {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, 1070 | {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, 1071 | {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, 1072 | {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, 1073 | {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, 1074 | {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, 1075 | {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, 1076 | {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, 1077 | {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, 1078 | {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, 1079 | {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, 1080 | {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, 1081 | {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, 1082 | {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, 1083 | {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, 1084 | {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, 1085 | {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, 1086 | {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, 1087 | {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, 1088 | {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, 1089 | {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, 1090 | {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, 1091 | ] 1092 | py = [ 1093 | {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, 1094 | {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, 1095 | ] 1096 | pycodestyle = [ 1097 | {file = "pycodestyle-2.7.0-py2.py3-none-any.whl", hash = "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068"}, 1098 | {file = "pycodestyle-2.7.0.tar.gz", hash = "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef"}, 1099 | ] 1100 | pycparser = [ 1101 | {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, 1102 | {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, 1103 | ] 1104 | pyflakes = [ 1105 | {file = "pyflakes-2.3.1-py2.py3-none-any.whl", hash = "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3"}, 1106 | {file = "pyflakes-2.3.1.tar.gz", hash = "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db"}, 1107 | ] 1108 | pygments = [ 1109 | {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, 1110 | {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, 1111 | ] 1112 | pyparsing = [ 1113 | {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, 1114 | {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, 1115 | ] 1116 | pyproject-flake8 = [ 1117 | {file = "pyproject-flake8-0.0.1a2.tar.gz", hash = "sha256:bdeca37f78ecd34bd64a49d3657d53d099f5445831071a31c46e1fe20cd61461"}, 1118 | {file = "pyproject_flake8-0.0.1a2-py2.py3-none-any.whl", hash = "sha256:e61ed1dc088e9f9f8a7170967ac4ec135acfef3a59ab9738c7b58cc11f294a7e"}, 1119 | ] 1120 | pytest = [ 1121 | {file = "pytest-6.2.4-py3-none-any.whl", hash = "sha256:91ef2131a9bd6be8f76f1f08eac5c5317221d6ad1e143ae03894b862e8976890"}, 1122 | {file = "pytest-6.2.4.tar.gz", hash = "sha256:50bcad0a0b9c5a72c8e4e7c9855a3ad496ca6a881a3641b4260605450772c54b"}, 1123 | ] 1124 | pytest-mock = [ 1125 | {file = "pytest-mock-3.6.1.tar.gz", hash = "sha256:40217a058c52a63f1042f0784f62009e976ba824c418cced42e88d5f40ab0e62"}, 1126 | {file = "pytest_mock-3.6.1-py3-none-any.whl", hash = "sha256:30c2f2cc9759e76eee674b81ea28c9f0b94f8f0445a1b87762cadf774f0df7e3"}, 1127 | ] 1128 | python-cfonts = [ 1129 | {file = "python-cfonts-1.5.2.tar.gz", hash = "sha256:85588e71003c7db986afaaa65755bad034c9f10ed29b32c5f2dc18ce9d77c030"}, 1130 | {file = "python_cfonts-1.5.2-py3-none-any.whl", hash = "sha256:88ddfffae675a2bc4e796baf057c5b989541a710bef4ac3e739edfbb388027ed"}, 1131 | ] 1132 | python-dotenv = [ 1133 | {file = "python-dotenv-0.18.0.tar.gz", hash = "sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"}, 1134 | {file = "python_dotenv-0.18.0-py2.py3-none-any.whl", hash = "sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d"}, 1135 | ] 1136 | pythonfinder = [ 1137 | {file = "pythonfinder-1.2.7-py2.py3-none-any.whl", hash = "sha256:d3120b9eb200cb817f3e2fc5a5b4a2d061224377de8f007fc19217ace82d209d"}, 1138 | {file = "pythonfinder-1.2.7.tar.gz", hash = "sha256:951796d7b195d09f2341087110feb903772477525272c8c1a48033fb08c0332e"}, 1139 | ] 1140 | pywin32-ctypes = [ 1141 | {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, 1142 | {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, 1143 | ] 1144 | pyyaml = [ 1145 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 1146 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 1147 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 1148 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 1149 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 1150 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 1151 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, 1152 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, 1153 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 1154 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 1155 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 1156 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 1157 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, 1158 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, 1159 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 1160 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 1161 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 1162 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 1163 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, 1164 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, 1165 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 1166 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 1167 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 1168 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 1169 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, 1170 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, 1171 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 1172 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 1173 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 1174 | ] 1175 | readme-renderer = [ 1176 | {file = "readme_renderer-29.0-py2.py3-none-any.whl", hash = "sha256:63b4075c6698fcfa78e584930f07f39e05d46f3ec97f65006e430b595ca6348c"}, 1177 | {file = "readme_renderer-29.0.tar.gz", hash = "sha256:92fd5ac2bf8677f310f3303aa4bce5b9d5f9f2094ab98c29f13791d7b805a3db"}, 1178 | ] 1179 | regex = [ 1180 | {file = "regex-2021.7.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e6a1e5ca97d411a461041d057348e578dc344ecd2add3555aedba3b408c9f874"}, 1181 | {file = "regex-2021.7.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6afe6a627888c9a6cfbb603d1d017ce204cebd589d66e0703309b8048c3b0854"}, 1182 | {file = "regex-2021.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ccb3d2190476d00414aab36cca453e4596e8f70a206e2aa8db3d495a109153d2"}, 1183 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:ed693137a9187052fc46eedfafdcb74e09917166362af4cc4fddc3b31560e93d"}, 1184 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99d8ab206a5270c1002bfcf25c51bf329ca951e5a169f3b43214fdda1f0b5f0d"}, 1185 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:b85ac458354165405c8a84725de7bbd07b00d9f72c31a60ffbf96bb38d3e25fa"}, 1186 | {file = "regex-2021.7.6-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3f5716923d3d0bfb27048242a6e0f14eecdb2e2a7fac47eda1d055288595f222"}, 1187 | {file = "regex-2021.7.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5983c19d0beb6af88cb4d47afb92d96751fb3fa1784d8785b1cdf14c6519407"}, 1188 | {file = "regex-2021.7.6-cp36-cp36m-win32.whl", hash = "sha256:c92831dac113a6e0ab28bc98f33781383fe294df1a2c3dfd1e850114da35fd5b"}, 1189 | {file = "regex-2021.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:791aa1b300e5b6e5d597c37c346fb4d66422178566bbb426dd87eaae475053fb"}, 1190 | {file = "regex-2021.7.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:59506c6e8bd9306cd8a41511e32d16d5d1194110b8cfe5a11d102d8b63cf945d"}, 1191 | {file = "regex-2021.7.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:564a4c8a29435d1f2256ba247a0315325ea63335508ad8ed938a4f14c4116a5d"}, 1192 | {file = "regex-2021.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:59c00bb8dd8775473cbfb967925ad2c3ecc8886b3b2d0c90a8e2707e06c743f0"}, 1193 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9a854b916806c7e3b40e6616ac9e85d3cdb7649d9e6590653deb5b341a736cec"}, 1194 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db2b7df831c3187a37f3bb80ec095f249fa276dbe09abd3d35297fc250385694"}, 1195 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:173bc44ff95bc1e96398c38f3629d86fa72e539c79900283afa895694229fe6a"}, 1196 | {file = "regex-2021.7.6-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:15dddb19823f5147e7517bb12635b3c82e6f2a3a6b696cc3e321522e8b9308ad"}, 1197 | {file = "regex-2021.7.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ddeabc7652024803666ea09f32dd1ed40a0579b6fbb2a213eba590683025895"}, 1198 | {file = "regex-2021.7.6-cp37-cp37m-win32.whl", hash = "sha256:f080248b3e029d052bf74a897b9d74cfb7643537fbde97fe8225a6467fb559b5"}, 1199 | {file = "regex-2021.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d8bbce0c96462dbceaa7ac4a7dfbbee92745b801b24bce10a98d2f2b1ea9432f"}, 1200 | {file = "regex-2021.7.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edd1a68f79b89b0c57339bce297ad5d5ffcc6ae7e1afdb10f1947706ed066c9c"}, 1201 | {file = "regex-2021.7.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:422dec1e7cbb2efbbe50e3f1de36b82906def93ed48da12d1714cabcd993d7f0"}, 1202 | {file = "regex-2021.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cbe23b323988a04c3e5b0c387fe3f8f363bf06c0680daf775875d979e376bd26"}, 1203 | {file = "regex-2021.7.6-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:0eb2c6e0fcec5e0f1d3bcc1133556563222a2ffd2211945d7b1480c1b1a42a6f"}, 1204 | {file = "regex-2021.7.6-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:1c78780bf46d620ff4fff40728f98b8afd8b8e35c3efd638c7df67be2d5cddbf"}, 1205 | {file = "regex-2021.7.6-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bc84fb254a875a9f66616ed4538542fb7965db6356f3df571d783f7c8d256edd"}, 1206 | {file = "regex-2021.7.6-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:598c0a79b4b851b922f504f9f39a863d83ebdfff787261a5ed061c21e67dd761"}, 1207 | {file = "regex-2021.7.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:875c355360d0f8d3d827e462b29ea7682bf52327d500a4f837e934e9e4656068"}, 1208 | {file = "regex-2021.7.6-cp38-cp38-win32.whl", hash = "sha256:e586f448df2bbc37dfadccdb7ccd125c62b4348cb90c10840d695592aa1b29e0"}, 1209 | {file = "regex-2021.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:2fe5e71e11a54e3355fa272137d521a40aace5d937d08b494bed4529964c19c4"}, 1210 | {file = "regex-2021.7.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6110bab7eab6566492618540c70edd4d2a18f40ca1d51d704f1d81c52d245026"}, 1211 | {file = "regex-2021.7.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4f64fc59fd5b10557f6cd0937e1597af022ad9b27d454e182485f1db3008f417"}, 1212 | {file = "regex-2021.7.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:89e5528803566af4df368df2d6f503c84fbfb8249e6631c7b025fe23e6bd0cde"}, 1213 | {file = "regex-2021.7.6-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2366fe0479ca0e9afa534174faa2beae87847d208d457d200183f28c74eaea59"}, 1214 | {file = "regex-2021.7.6-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f9392a4555f3e4cb45310a65b403d86b589adc773898c25a39184b1ba4db8985"}, 1215 | {file = "regex-2021.7.6-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:2bceeb491b38225b1fee4517107b8491ba54fba77cf22a12e996d96a3c55613d"}, 1216 | {file = "regex-2021.7.6-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:f98dc35ab9a749276f1a4a38ab3e0e2ba1662ce710f6530f5b0a6656f1c32b58"}, 1217 | {file = "regex-2021.7.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:319eb2a8d0888fa6f1d9177705f341bc9455a2c8aca130016e52c7fe8d6c37a3"}, 1218 | {file = "regex-2021.7.6-cp39-cp39-win32.whl", hash = "sha256:eaf58b9e30e0e546cdc3ac06cf9165a1ca5b3de8221e9df679416ca667972035"}, 1219 | {file = "regex-2021.7.6-cp39-cp39-win_amd64.whl", hash = "sha256:4c9c3155fe74269f61e27617529b7f09552fbb12e44b1189cebbdb24294e6e1c"}, 1220 | {file = "regex-2021.7.6.tar.gz", hash = "sha256:8394e266005f2d8c6f0bc6780001f7afa3ef81a7a2111fa35058ded6fce79e4d"}, 1221 | ] 1222 | requests = [ 1223 | {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, 1224 | {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, 1225 | ] 1226 | requests-toolbelt = [ 1227 | {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, 1228 | {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, 1229 | ] 1230 | resolvelib = [ 1231 | {file = "resolvelib-0.7.1-py2.py3-none-any.whl", hash = "sha256:4bb1e7ec9b3054c3914cad1e715288b11091756bdb72af49fb8986931715a01a"}, 1232 | {file = "resolvelib-0.7.1.tar.gz", hash = "sha256:c526cda7f080d908846262d86c738231d9bfb556eb02d77167b685d65d85ace9"}, 1233 | ] 1234 | rfc3986 = [ 1235 | {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, 1236 | {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, 1237 | ] 1238 | secretstorage = [ 1239 | {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, 1240 | {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, 1241 | ] 1242 | shellingham = [ 1243 | {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, 1244 | {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, 1245 | ] 1246 | six = [ 1247 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1248 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1249 | ] 1250 | taskipy = [ 1251 | {file = "taskipy-1.8.1-py3-none-any.whl", hash = "sha256:2b98f499966e40175d1f1306a64587f49dfa41b90d0d86c8f28b067cc58d0a56"}, 1252 | {file = "taskipy-1.8.1.tar.gz", hash = "sha256:7a2404125817e45d80e13fa663cae35da6e8ba590230094e815633653e25f98f"}, 1253 | ] 1254 | toml = [ 1255 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1256 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1257 | ] 1258 | tqdm = [ 1259 | {file = "tqdm-4.61.2-py2.py3-none-any.whl", hash = "sha256:5aa445ea0ad8b16d82b15ab342de6b195a722d75fc1ef9934a46bba6feafbc64"}, 1260 | {file = "tqdm-4.61.2.tar.gz", hash = "sha256:8bb94db0d4468fea27d004a0f1d1c02da3cdedc00fe491c0de986b76a04d6b0a"}, 1261 | ] 1262 | twine = [ 1263 | {file = "twine-3.4.1-py3-none-any.whl", hash = "sha256:16f706f2f1687d7ce30e7effceee40ed0a09b7c33b9abb5ef6434e5551565d83"}, 1264 | {file = "twine-3.4.1.tar.gz", hash = "sha256:a56c985264b991dc8a8f4234eb80c5af87fa8080d0c224ad8f2cd05a2c22e83b"}, 1265 | ] 1266 | typed-ast = [ 1267 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, 1268 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, 1269 | {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, 1270 | {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, 1271 | {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, 1272 | {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, 1273 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, 1274 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, 1275 | {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, 1276 | {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, 1277 | {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, 1278 | {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, 1279 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, 1280 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, 1281 | {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, 1282 | {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, 1283 | {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, 1284 | {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, 1285 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, 1286 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, 1287 | {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, 1288 | {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, 1289 | {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, 1290 | {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, 1291 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, 1292 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, 1293 | {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, 1294 | {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, 1295 | {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, 1296 | {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, 1297 | ] 1298 | typing-extensions = [ 1299 | {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, 1300 | {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, 1301 | {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, 1302 | ] 1303 | urllib3 = [ 1304 | {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, 1305 | {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, 1306 | ] 1307 | virtualenv = [ 1308 | {file = "virtualenv-20.4.7-py2.py3-none-any.whl", hash = "sha256:2b0126166ea7c9c3661f5b8e06773d28f83322de7a3ff7d06f0aed18c9de6a76"}, 1309 | {file = "virtualenv-20.4.7.tar.gz", hash = "sha256:14fdf849f80dbb29a4eb6caa9875d476ee2a5cf76a5f5415fa2f1606010ab467"}, 1310 | ] 1311 | webencodings = [ 1312 | {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, 1313 | {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, 1314 | ] 1315 | zipp = [ 1316 | {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, 1317 | {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, 1318 | ] 1319 | --------------------------------------------------------------------------------