From dca076a81c1d90f9f43aacc86db2bf9af3a5e7e6 Mon Sep 17 00:00:00 2001 From: bswck Date: Tue, 26 Mar 2024 23:41:35 +0100 Subject: [PATCH] Upgrade to bswck/skeleton@0.0.2rc-180-g2a2d737 Skeleton revision: https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737 --- .copier-answers.yml | 37 +- .github/FUNDING.yml | 6 +- .github/ISSUE_TEMPLATE/bug.yml | 4 +- .github/ISSUE_TEMPLATE/config.yml | 4 +- .github/ISSUE_TEMPLATE/functionality.yml | 4 +- .github/PULL_REQUEST_TEMPLATE.md | 4 +- .github/dependabot.yml | 35 + .github/workflows/audit.yml | 31 + .github/workflows/coverage.yml | 110 +++ .github/workflows/doclinks.yml | 29 + .github/workflows/documentation-links.yml | 23 - .github/workflows/lint.yml | 22 +- .github/workflows/mypy.yml | 11 +- .github/workflows/news.yml | 39 + .github/workflows/release.yml | 17 +- .github/workflows/smokeshow.yml | 37 - .github/workflows/test.yml | 41 +- .gitignore | 4 +- .pre-commit-config.yaml | 22 +- .readthedocs.yml | 12 +- CONTRIBUTING.md | 17 +- README.md | 45 +- changes/.gitignore | 5 - docs/api.md | 3 + docs/contributing.md | 17 +- docs/index.md | 45 +- mkdocs.yml | 48 +- news/.gitignore | 5 + playground/.gitkeep | 0 poetry.lock | 896 ++++++++++++++------- project/__init__.py | 8 +- project/__main__.py | 16 + pyproject.toml | 69 +- scripts/bf2dfcf.sh | 161 ---- scripts/release.py | 48 +- scripts/skeleton.0.0.2rc-180-g2a2d737.bash | 179 ++++ setup-local.bash | 560 +++++++++++++ 37 files changed, 1886 insertions(+), 728 deletions(-) create mode 100644 .github/workflows/audit.yml create mode 100644 .github/workflows/coverage.yml create mode 100644 .github/workflows/doclinks.yml delete mode 100644 .github/workflows/documentation-links.yml create mode 100644 .github/workflows/news.yml delete mode 100644 .github/workflows/smokeshow.yml delete mode 100644 changes/.gitignore create mode 100644 docs/api.md create mode 100644 news/.gitignore delete mode 100644 playground/.gitkeep create mode 100644 project/__main__.py delete mode 100755 scripts/bf2dfcf.sh create mode 100755 scripts/skeleton.0.0.2rc-180-g2a2d737.bash create mode 100755 setup-local.bash diff --git a/.copier-answers.yml b/.copier-answers.yml index a8bdf71..9248fd1 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,21 +1,24 @@ -_commit: bf2dfcf +_commit: 0.0.2rc-180-g2a2d737 _src_path: gh:bswck/skeleton -author_username: bswck +author: bswck +cli: true +copyright: Bartosz Sławecki +description: Set up projects for development quickly. docs: true -docs_slug: project -email_address: bswck.dev@gmail.com -github_username: bswck -license_name: MIT -org_full_name: Bartosz Sławecki -package_name: project -project_description: Automatically detect backends & initialize virtual environments - for your Python repo clones. -publish_on_pypi: true -pypi_project_description: Automatically detect backends & initialize virtual environments - for your Python repo clones. -pypi_project_name: project -python_version: '3.8' -repo_name: project +email: bartoszpiotrslawecki@gmail.com +github: bswck +license: MIT +package: project +precommit: true +pypi: true +pypi_description: Set up projects for development quickly. +pypi_project: project +pypy: true +python: '3.8' +python_until: '4.0' +repo: project +rtd: project tests: true -use_precommit: true +tidelift: false visibility: public +wip: true diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 9d20d0f..a3932d5 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,5 +1,5 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/%23%25%20if%20author_username%20%3D%3D%20%22bswck%22%20%25%23FUNDING.yml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/%23%25%20if%20author%20%3D%3D%20%22bswck%22%20%25%23FUNDING.yml%23%25%20endif%20%25%23.jinja -github: "bswck" \ No newline at end of file +github: "bswck" diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index cd6b842..493b64c 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -1,6 +1,6 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/ISSUE_TEMPLATE/bug.yml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/ISSUE_TEMPLATE/bug.yml.jinja # docs https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms # https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 2d9bbed..df42220 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,5 +1,5 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/ISSUE_TEMPLATE/config.yml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/ISSUE_TEMPLATE/config.yml.jinja blank_issues_enabled: true diff --git a/.github/ISSUE_TEMPLATE/functionality.yml b/.github/ISSUE_TEMPLATE/functionality.yml index 75575bb..e9e015b 100644 --- a/.github/ISSUE_TEMPLATE/functionality.yml +++ b/.github/ISSUE_TEMPLATE/functionality.yml @@ -1,6 +1,6 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/ISSUE_TEMPLATE/functionality.yml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/ISSUE_TEMPLATE/functionality.yml.jinja # docs https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-issue-forms # https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3aa0b03..881fef6 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,5 +1,5 @@ @@ -22,7 +22,7 @@ This pull request is: - [ ] A new feature implementation - Please include the issue number, and create an issue if none exists, which must include a complete example of how the feature would look. - - Please include: `Fixes: #` in the commit message extended description. + - Please include: `Fixes #` in the commit message extended description. - Please include tests. **Have a great day!** diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 53007fa..f6d7f02 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,41 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/dependabot.yml.jinja + version: 2 updates: - package-ecosystem: "gitsubmodule" directory: "/" schedule: interval: "daily" +- package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "daily" + ignore: + # Actions managed by https://github.com/bswck/skeleton + - dependency-name: "actions/checkout" + - dependency-name: "actions/setup-python" + - dependency-name: "codecov/codecov-action" + - dependency-name: "pypa/gh-action-pypi-publish" + - dependency-name: "pypa/gh-action-pip-audit" + - dependency-name: "actions/download-artifact" + - dependency-name: "actions/upload-artifact" + - dependency-name: "readthedocs/actions/preview" +- package-ecosystem: "pip" + directory: "/" + schedule: + interval: "daily" + ignore: + # Dependencies managed by https://github.com/bswck/skeleton + - dependency-name: "mypy" + - dependency-name: "ruff" + - dependency-name: "towncrier" + - dependency-name: "coverage" + - dependency-name: "pytest" + - dependency-name: "pytest-doctestplus" + - dependency-name: "covdefaults" + - dependency-name: "poethepoet" + - dependency-name: "pre-commit" + - dependency-name: "smokeshow" + - dependency-name: "keyring" \ No newline at end of file diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml new file mode 100644 index 0000000..d80ed03 --- /dev/null +++ b/.github/workflows/audit.yml @@ -0,0 +1,31 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/audit.yml.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. + +name: "Audit" + +on: ["push"] + +jobs: + pip-audit: + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v4" + - name: "Install Poetry" + run: "pipx install poetry==1.7.1" + - name: "Set up Python 3.8" + uses: "actions/setup-python@v5" + with: + cache: "poetry" + - name: "Install the project" + run: "poetry install" + - name: "Set up Python location for pip-audit" + shell: "bash" + run: 'echo "PIPAPI_PYTHON_LOCATION=$(poetry env info -e)" >> $GITHUB_ENV' + - name: "Audit" + uses: "pypa/gh-action-pip-audit@v1.0.8" diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000..15cfa03 --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,110 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/%23%25%20if%20tests%20and%20public%20%25%23coverage.yml%23%25%20endif%20%25%23.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. + +name: "Coverage" + +on: + workflow_run: + workflows: ["Tests"] + types: ["completed"] + +permissions: + actions: "read" + statuses: "write" + +jobs: + combine: + if: "${{github.event.workflow_run.conclusion == 'success'}}" + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v4" + - name: "Install Poetry" + run: "pipx install poetry==1.7.1" + - name: "Set up Python" + uses: "actions/setup-python@v5" + with: + cache: "poetry" + - name: "Install the project" + run: "poetry install --only=dev,dev-skeleton" + - run: "gh run download ${{github.event.workflow_run.id}} --dir .covfiles/" + env: + GH_TOKEN: "${{github.token}}" + - name: "Combine coverage data files from multicontextual runs" + run: "poetry run coverage combine --append .covfiles/*" + - name: "Show coverage report" + run: "poetry run coverage report --show-missing --fail-under=0" + - name: "Upload coverage data file" + uses: "actions/upload-artifact@v4" + with: + name: "coverage" + path: ".coverage" + - run: "poetry run coverage xml --fail-under=0" + - name: "Upload coverage XML report" + uses: "actions/upload-artifact@v4" + with: + name: "coverage-xml" + path: "coverage.xml" + - run: > + poetry run coverage html + --fail-under=0 + --directory=.covhtml/ + --show-contexts + --title "project coverage for ${{github.sha}}" + - name: "Upload coverage HTML report" + uses: "actions/upload-artifact@v4" + with: + name: "coverage-html" + path: ".covhtml/" + + codecov: + needs: "combine" + if: "${{github.event.workflow_run.pull_requests[0]}}" + runs-on: "ubuntu-latest" + environment: "Coverage" + steps: + - uses: "actions/checkout@v4" + - uses: "actions/download-artifact@v4" + with: + name: "coverage-xml" + merge-multiple: true + - name: "Upload coverage reports to Codecov" + uses: "codecov/codecov-action@v4" + with: + files: "coverage.xml" + env: + CODECOV_TOKEN: "${{secrets.CODECOV_TOKEN}}" + + smokeshow: + needs: "combine" + if: "${{github.event.workflow_run.head_branch == 'main'}}" + runs-on: "ubuntu-latest" + environment: "Coverage" + steps: + - uses: "actions/checkout@v4" + - name: "Install Poetry" + run: "pipx install poetry==1.7.1" + - uses: "actions/setup-python@v5" + with: + cache: "poetry" + - name: "Install the project" + run: "poetry install --only=dev,dev-skeleton" + - name: "Download coverage reports" + uses: "actions/download-artifact@v4" + with: + name: "coverage-html" + path: ".covhtml/" + merge-multiple: true + - run: "poetry run smokeshow upload .covhtml/" + env: + SMOKESHOW_GITHUB_STATUS_DESCRIPTION: "Coverage {coverage-percentage}" + SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 90 + SMOKESHOW_GITHUB_CONTEXT: "coverage" + SMOKESHOW_GITHUB_TOKEN: "${{secrets.GITHUB_TOKEN}}" + SMOKESHOW_GITHUB_PR_HEAD_SHA: "${{github.event.workflow_run.head_sha}}" + SMOKESHOW_AUTH_KEY: "${{secrets.SMOKESHOW_AUTH_KEY}}" diff --git a/.github/workflows/doclinks.yml b/.github/workflows/doclinks.yml new file mode 100644 index 0000000..7389079 --- /dev/null +++ b/.github/workflows/doclinks.yml @@ -0,0 +1,29 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/%23%25%20if%20docs%20%25%23doclinks.yml%23%25%20endif%20%25%23.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. + +name: "ReadTheDocs Preview" + +on: + pull_request_target: + types: + - "opened" + paths: + - "docs/**" + - "CHANGELOG.md" + +permissions: + pull-requests: "write" + +jobs: + documentation-links: + runs-on: "ubuntu-latest" + steps: + - uses: "readthedocs/actions/preview@v1" + with: + project-slug: "project" \ No newline at end of file diff --git a/.github/workflows/documentation-links.yml b/.github/workflows/documentation-links.yml deleted file mode 100644 index 9cd9e9b..0000000 --- a/.github/workflows/documentation-links.yml +++ /dev/null @@ -1,23 +0,0 @@ -# This file was generated from bswck/skeleton@bf2dfcf. -# Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/%23%25%20if%20docs%20%25%23documentation-links.yml%23%25%20endif%20%25%23.jinja - -name: "readthedocs/actions" -on: - pull_request_target: - types: - - "opened" - paths: - - "docs/**" - - "CHANGELOG.md" - -permissions: - pull-requests: "write" - -jobs: - documentation-links: - runs-on: "ubuntu-latest" - steps: - - uses: "readthedocs/actions/preview@v1" - with: - project-slug: "project" \ No newline at end of file diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5253c38..dcb216b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,6 +1,11 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/lint.yml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/lint.yml.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. name: "Lint" @@ -11,12 +16,13 @@ jobs: runs-on: "ubuntu-latest" steps: - uses: "actions/checkout@v4" + - name: "Install Poetry" + run: "pipx install poetry==1.7.1" - name: "Set up Python 3.8" - uses: "actions/setup-python@v4" + uses: "actions/setup-python@v5" with: - python-version: "3.8" - - name: "Install Ruff" - run: | - pip install ruff + cache: "poetry" + - name: "Install the project" + run: "poetry install --only=dev,dev-skeleton" - name: "Analyze the code with Ruff" - run: "ruff ." + run: "poetry run ruff check ." diff --git a/.github/workflows/mypy.yml b/.github/workflows/mypy.yml index c9400e5..a0f8e0d 100644 --- a/.github/workflows/mypy.yml +++ b/.github/workflows/mypy.yml @@ -1,6 +1,11 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/mypy.yml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/mypy.yml.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. name: "Mypy" @@ -12,7 +17,7 @@ jobs: steps: - uses: "actions/checkout@v4" - name: "Install Poetry" - run: "pipx install poetry" + run: "pipx install poetry==1.7.1" - name: "Set up Python 3.8" uses: "actions/setup-python@v5" with: diff --git a/.github/workflows/news.yml b/.github/workflows/news.yml new file mode 100644 index 0000000..1c40dd9 --- /dev/null +++ b/.github/workflows/news.yml @@ -0,0 +1,39 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/news.yml.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. + +name: "Check news entry" + +on: + pull_request: + types: + - "labeled" + - "unlabeled" + - "opened" + - "reopened" + - "synchronize" + +env: + SKIP_NEWS_FROM_USERS: + - "dependabot[bot]" + - "pre-commit-ci[bot]" + +jobs: + check-news-entry: + runs-on: "ubuntu-latest" + steps: + - uses: "actions/checkout@v4" + with: + # `towncrier check` runs `git diff --name-only origin/main...`, which + # needs a non-shallow clone. + fetch-depth: 0 + - name: "Check news entry" + if: > + !contains(github.event.pull_request.labels.*.name, 'skip news') + && !contains(env.SKIP_NEWS_FROM_USERS, github.event.pull_request.user.login) + run: "pipx run towncrier check --compare-with origin/${{github.base_ref}}" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b4ba636..8793677 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,11 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/%23%25%20if%20publish_on_pypi%20%25%23release.yml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/%23%25%20if%20pypi%20%25%23release.yml%23%25%20endif%20%25%23.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. name: "PyPI" @@ -18,11 +23,9 @@ jobs: POETRY_VIRTUALENVS_CREATE: "false" steps: - uses: "actions/checkout@v4" - - name: "Install poetry" - run: | - pipx install poetry + - name: "Install Poetry" + run: "pipx install poetry==1.7.1" - name: "Build with poetry" - run: | - poetry build + run: "poetry build" - name: "Publish package distributions to PyPI" uses: "pypa/gh-action-pypi-publish@release/v1" diff --git a/.github/workflows/smokeshow.yml b/.github/workflows/smokeshow.yml deleted file mode 100644 index 8dffbd8..0000000 --- a/.github/workflows/smokeshow.yml +++ /dev/null @@ -1,37 +0,0 @@ -# This file was generated from bswck/skeleton@bf2dfcf. -# Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/%23%25%20if%20public%20%25%23smokeshow.yml%23%25%20endif%20%25%23.jinja - -name: "Smokeshow" - -on: - workflow_run: - workflows: ["Tests"] - types: ["completed"] - -permissions: - actions: "read" - statuses: "write" - -jobs: - smokeshow: - runs-on: "ubuntu-latest" - environment: "Smokeshow" - steps: - - uses: "actions/setup-python@v5" - with: - python-version: "3.8" - - run: "pip install smokeshow" - - uses: "dawidd6/action-download-artifact@v2" - with: - workflow: "test.yml" - commit: "${{github.event.workflow_run.head_sha}}" - - run: "smokeshow upload coverage-html" - env: - SMOKESHOW_GITHUB_STATUS_DESCRIPTION: "Coverage {coverage-percentage}" - # 5 is set here while V2 is in development and coverage is far from complete - SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 91 - SMOKESHOW_GITHUB_CONTEXT: "coverage" - SMOKESHOW_GITHUB_TOKEN: "${{secrets.GITHUB_TOKEN}}" - SMOKESHOW_GITHUB_PR_HEAD_SHA: "${{github.event.workflow_run.head_sha}}" - SMOKESHOW_AUTH_KEY: "${{secrets.SMOKESHOW_AUTH_KEY}}" diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 8c2961a..4177c43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,6 +1,11 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.github/workflows/%23%25%20if%20tests%20%25%23test.yml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.github/workflows/%23%25%20if%20tests%20%25%23test.yml%23%25%20endif%20%25%23.jinja + +# IMPORTANT! +# Pinned versions of actions and Poetry are managed in a different repository. +# Do not submit PRs to this file unless for this repo specifically. +# To change this workflow globally, submit a PR to https://github.com/bswck/skeleton. name: "Tests" @@ -8,16 +13,20 @@ on: ["push"] jobs: test: - runs-on: "ubuntu-latest" + runs-on: "${{matrix.os}}-latest" environment: "Test" strategy: fail-fast: false matrix: - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + os: ["ubuntu", "macos", "windows"] + python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "pypy3.8", "pypy3.9", "pypy3.10"] + env: + context: "${{matrix.python-version}}-${{matrix.os}}" + timeout-minutes: 10 steps: - uses: "actions/checkout@v4" - name: "Install Poetry" - run: "pipx install poetry" + run: "pipx install poetry==1.7.1" - name: "Set up Python ${{matrix.python-version}}" uses: "actions/setup-python@v5" with: @@ -26,14 +35,18 @@ jobs: - name: "Install the project" run: "poetry install" - name: "Run tests" - run: "poetry run coverage run -m pytest -v ." - - name: "Report coverage" + env: + PY_COLORS: 1 # Thanks @zanieb! run: > - poetry run coverage report - && poetry run coverage html --show-contexts - --title "project coverage for ${{github.sha}} (measured on Python ${{matrix.python-version}})" - - name: "Store coverage html" - uses: "actions/upload-artifact@v3" + poetry run coverage run + --context=${{env.context}} + -m pytest --doctest-only -v . + - name: "Show coverage report" + run: "poetry run coverage report --show-missing --fail-under=0" + - run: "mv .coverage .coverage.${{env.context}}" + - name: "Upload coverage data file artifact" + uses: "actions/upload-artifact@v4" with: - name: "coverage-html" - path: "htmlcov" \ No newline at end of file + name: "coverage-${{env.context}}" + path: ".coverage.${{env.context}}" + overwrite: true diff --git a/.gitignore b/.gitignore index a490e74..383fc30 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/.gitignore.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/.gitignore.jinja # Byte-compiled / optimized / DLL files __pycache__/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index faebfe3..fee41aa 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,10 +1,14 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/%23%25%20if%20use_precommit%20%25%23.pre-commit-config.yaml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/%23%25%20if%20precommit%20%25%23.pre-commit-config.yaml%23%25%20endif%20%25%23.jinja + +default_install_hook_types: +- "pre-commit" +- "pre-push" repos: - repo: "https://github.com/astral-sh/ruff-pre-commit" - rev: "v0.1.5" + rev: "v0.2.2" hooks: - id: "ruff" name: "Run the Ruff linter" @@ -13,13 +17,19 @@ repos: - id: "ruff-format" name: "Run the Ruff formatter" types_or: ["python", "pyi"] +- repo: "https://github.com/pre-commit/pre-commit-hooks" + rev: "v4.5.0" + hooks: + - id: "check-merge-conflict" + args: ["--assume-in-merge"] + name: "Check for merge conflicts" + stages: ["push"] - repo: "https://github.com/python-poetry/poetry" - rev: "1.7.0" + rev: "1.7.1" hooks: - id: "poetry-lock" stages: ["push"] name: "Run Poetry lock hook" - args: ["--no-update"] - id: "poetry-check" stages: ["push"] - name: "Run Poetry check hook" \ No newline at end of file + name: "Run Poetry check hook" diff --git a/.readthedocs.yml b/.readthedocs.yml index ff9e9bf..fb42633 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,6 +1,6 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/%23%25%20if%20docs%20%25%23.readthedocs.yml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/%23%25%20if%20docs%20%25%23.readthedocs.yml%23%25%20endif%20%25%23.jinja # # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details @@ -8,11 +8,13 @@ version: 2 mkdocs: configuration: "mkdocs.yml" build: - os: "ubuntu-22.04" + os: "ubuntu-lts-latest" tools: python: "3.8" jobs: post_install: - - "pip install poetry" + - "python -m pip install --upgrade --no-cache-dir poetry poetry-plugin-export" - "poetry config virtualenvs.create false" - - "poetry install --with=docs" + - "poetry install --only=docs --sync" + - "poetry export --only=docs -f requirements.txt -o requirements.txt" + - "python -m pip install -r requirements.txt" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc61b7f..cf84ba5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,7 @@ # Contributing to [project](https://github.com/bswck/project) 🎉 Contributions are very welcome. 🚀 @@ -46,16 +46,12 @@ Ready to contribute? Here's a quick guide on how to set up project and make a ch - > [!Note] > If you use Windows, it is highly recommended to complete the installation in the way presented below through [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install). - - - 1. Fork the [project repository](https://github.com/bswck/project) on GitHub. 1. [Install Poetry](https://python-poetry.org/docs/#installation).
@@ -87,10 +83,9 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/fragments/guide.md ```shell poetry shell - pre-commit install --hook-type pre-commit --hook-type pre-push + pre-commit install ``` - 1. Create a branch for local development: ```shell @@ -108,7 +103,7 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/fragments/guide.md 1. Commit your changes and push your branch to GitHub: ```shell - git add . + git add -A git commit -m "Short description of changes (50 chars max)" -m "Optional extended description" git push origin name-of-your-bugfix-or-feature ``` diff --git a/README.md b/README.md index b4af1df..2ccd7f1 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,15 @@ -# project [![skeleton](https://img.shields.io/badge/bf2dfcf-skeleton?label=%F0%9F%92%80%20bswck/skeleton&labelColor=black&color=grey&link=https%3A//github.com/bswck/skeleton)](https://github.com/bswck/skeleton/tree/bf2dfcf) -[![Package version](https://img.shields.io/pypi/v/project?label=PyPI)](https://pypi.org/project/project/) -[![Supported Python versions](https://img.shields.io/pypi/pyversions/project.svg?logo=python&label=Python)](https://pypi.org/project/project/) +# project [![skeleton](https://img.shields.io/badge/0.0.2rc–180–g2a2d737-skeleton?label=%F0%9F%92%80%20bswck/skeleton&labelColor=black&color=grey&link=https%3A//github.com/bswck/skeleton)](https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737) [![Supported Python versions](https://img.shields.io/pypi/pyversions/project.svg?logo=python&label=Python)](https://pypi.org/project/project/) [![Package version](https://img.shields.io/pypi/v/project?label=PyPI)](https://pypi.org/project/project/) [![Tests](https://github.com/bswck/project/actions/workflows/test.yml/badge.svg)](https://github.com/bswck/project/actions/workflows/test.yml) [![Coverage](https://coverage-badge.samuelcolvin.workers.dev/bswck/project.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/bswck/project) -[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/) -[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) -[![License](https://img.shields.io/github/license/bswck/project.svg?label=License)](https://github.com/bswck/project/blob/HEAD/LICENSE) -[![Pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) - -Automatically detect backends & initialize virtual environments for your Python repo clones. +[![Documentation Status](https://readthedocs.org/projects/project/badge/?version=latest)](https://project.readthedocs.io/en/latest/?badge=latest) > [!Warning] -> 🚧 This project is currently in the **Work in Progress** state. 🚧 +> **Work in Progress**. 🚧 > -> Hit the `👁 Watch` button to know when it's ready to be tried out! +> Hit the `👁 Watch` button to know when this project is ready to be tried out! + +Set up projects for development quickly. # Idea - `project clone [URL]` → clone and install a Python project @@ -26,34 +21,35 @@ Automatically detect backends & initialize virtual environments for your Python - `project audit` → `project lint; project test` # Installation +To use this globally as a CLI tool only, simply install it with [pipx](https://github.com/pypa/pipx): +```shell +pipx install project +``` - -You might simply install it with pip: +But you might also simply install it with pip to access the library API: ```shell pip install project ``` -If you use [Poetry](https://python-poetry.org/), then run: +If you use [Poetry](https://python-poetry.org/), then you might want to run: ```shell poetry add project ``` -## For contributors - +## For Contributors +[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) +[![Pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) - > [!Note] > If you use Windows, it is highly recommended to complete the installation in the way presented below through [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install). - - - 1. Fork the [project repository](https://github.com/bswck/project) on GitHub. 1. [Install Poetry](https://python-poetry.org/docs/#installation).
@@ -85,13 +81,12 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/project/README.md.jinja ```shell poetry shell - pre-commit install --hook-type pre-commit --hook-type pre-push + pre-commit install ``` For more information on how to contribute, check out [CONTRIBUTING.md](https://github.com/bswck/project/blob/HEAD/CONTRIBUTING.md).
Always happy to accept contributions! ❤️ - -# Legal info +# Legal Info © Copyright by Bartosz Sławecki ([@bswck](https://github.com/bswck)).
This software is licensed under the terms of [MIT License](https://github.com/bswck/project/blob/HEAD/LICENSE). diff --git a/changes/.gitignore b/changes/.gitignore deleted file mode 100644 index c18137f..0000000 --- a/changes/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -# This file was generated from bswck/skeleton@bf2dfcf. -# Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/changes/.gitignore.jinja - -!.gitignore \ No newline at end of file diff --git a/docs/api.md b/docs/api.md new file mode 100644 index 0000000..8dfabff --- /dev/null +++ b/docs/api.md @@ -0,0 +1,3 @@ +::: project + options: + show_submodules: true \ No newline at end of file diff --git a/docs/contributing.md b/docs/contributing.md index 7c91bb3..a266f64 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,8 +1,8 @@ # Contributing to [project](https://github.com/bswck/project) 🎉 Contributions are very welcome. 🚀 @@ -47,16 +47,12 @@ Ready to contribute? Here's a quick guide on how to set up project and make a ch - !!! Note If you use Windows, it is highly recommended to complete the installation in the way presented below through [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install). - - - 1. Fork the [project repository](https://github.com/bswck/project) on GitHub. 1. [Install Poetry](https://python-poetry.org/docs/#installation).
@@ -88,10 +84,9 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/project/%23%25%20if%20docs%20%25% ```shell poetry shell - pre-commit install --hook-type pre-commit --hook-type pre-push + pre-commit install ``` - 1. Create a branch for local development: ```shell @@ -109,7 +104,7 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/project/%23%25%20if%20docs%20%25% 1. Commit your changes and push your branch to GitHub: ```shell - git add . + git add -A git commit -m "Short description of changes (50 chars max)" -m "Optional extended description" git push origin name-of-your-bugfix-or-feature ``` diff --git a/docs/index.md b/docs/index.md index 0eff96c..ba50d02 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,46 +1,48 @@ -# project [![skeleton](https://img.shields.io/badge/bf2dfcf-skeleton?label=%F0%9F%92%80%20bswck/skeleton&labelColor=black&color=grey&link=https%3A//github.com/bswck/skeleton)](https://github.com/bswck/skeleton/tree/bf2dfcf) -[![Package version](https://img.shields.io/pypi/v/project?label=PyPI)](https://pypi.org/project/project/) -[![Supported Python versions](https://img.shields.io/pypi/pyversions/project.svg?logo=python&label=Python)](https://pypi.org/project/project/) +# project [![skeleton](https://img.shields.io/badge/0.0.2rc–180–g2a2d737-skeleton?label=%F0%9F%92%80%20bswck/skeleton&labelColor=black&color=grey&link=https%3A//github.com/bswck/skeleton)](https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737) [![Supported Python versions](https://img.shields.io/pypi/pyversions/project.svg?logo=python&label=Python)](https://pypi.org/project/project/) [![Package version](https://img.shields.io/pypi/v/project?label=PyPI)](https://pypi.org/project/project/) [![Tests](https://github.com/bswck/project/actions/workflows/test.yml/badge.svg)](https://github.com/bswck/project/actions/workflows/test.yml) [![Coverage](https://coverage-badge.samuelcolvin.workers.dev/bswck/project.svg)](https://coverage-badge.samuelcolvin.workers.dev/redirect/bswck/project) -[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/) -[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) -[![License](https://img.shields.io/github/license/bswck/project.svg?label=License)](https://github.com/bswck/project/blob/HEAD/LICENSE) -[![Pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) +[![Documentation Status](https://readthedocs.org/projects/project/badge/?version=latest)](https://project.readthedocs.io/en/latest/?badge=latest) -Automatically detect backends & initialize virtual environments for your Python repo clones. +!!! warning + **Work in Progress**. 🚧 + + [Hit the `👁 Watch` button on GitHub](https://github.com/bswck/project) to know when this project is ready to be tried out! -# Installation +Set up projects for development quickly. +# Installation +To use this globally as a CLI tool only, simply install it with [pipx](https://github.com/pypa/pipx): + +```shell +pipx install project +``` -You might simply install it with pip: +But you might also simply install it with pip to access the library API: ```shell pip install project ``` -If you use [Poetry](https://python-poetry.org/), then run: +If you use [Poetry](https://python-poetry.org/), then you might want to run: ```shell poetry add project ``` -## For contributors - +## For Contributors +[![Poetry](https://img.shields.io/endpoint?url=https://python-poetry.org/badge/v0.json)](https://python-poetry.org/) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) +[![Pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit) - !!! Note If you use Windows, it is highly recommended to complete the installation in the way presented below through [WSL2](https://learn.microsoft.com/en-us/windows/wsl/install). - - - 1. Fork the [project repository](https://github.com/bswck/project) on GitHub. 1. [Install Poetry](https://python-poetry.org/docs/#installation).
@@ -72,13 +74,12 @@ https://github.com/bswck/skeleton/tree/bf2dfcf/fragments/readme.md ```shell poetry shell - pre-commit install --hook-type pre-commit --hook-type pre-push + pre-commit install ``` For more information on how to contribute, check out [CONTRIBUTING.md](https://github.com/bswck/project/blob/HEAD/CONTRIBUTING.md).
Always happy to accept contributions! ❤️ - -# Legal info +# Legal Info © Copyright by Bartosz Sławecki ([@bswck](https://github.com/bswck)).
This software is licensed under the terms of [MIT License](https://github.com/bswck/project/blob/HEAD/LICENSE). diff --git a/mkdocs.yml b/mkdocs.yml index 480155d..978db30 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,21 +1,18 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/%23%25%20if%20docs%20%25%23mkdocs.yml%23%25%20endif%20%25%23.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/%23%25%20if%20docs%20%25%23mkdocs.yml%23%25%20endif%20%25%23.jinja site_name: "project" -site_description: "Automatically detect backends & initialize virtual environments for your Python repo clones." +site_description: "Set up projects for development quickly." site_url: "https://project.readthedocs.io/en/latest/" repo_url: "https://github.com/bswck/project" -repo_name: "bswck/project" watch: - "project" nav: - "Overview": "index.md" +- "API Reference": "api.md" - "Contributing": "contributing.md" -# - "API Reference": -# - module.py: "reference/module.md" -# - etc. - "Changelog": "changelog.md" theme: @@ -25,45 +22,50 @@ theme: - "navigation.top" - "navigation.tracking" palette: - - media: "(prefers-color-scheme)" - toggle: - icon: "material/brightness-auto" - name: "Switch to light mode" - media: "(prefers-color-scheme: light)" scheme: "default" primary: "teal" accent: "purple" toggle: - icon: "material/weather-sunny" + icon: "material/weather-night" name: "Switch to dark mode" - media: "(prefers-color-scheme: dark)" scheme: "slate" primary: "black" accent: "lime" toggle: - icon: "material/weather-night" + icon: "material/brightness-auto" name: "Switch to system preference" + - media: "(prefers-color-scheme)" + toggle: + icon: "material/weather-sunny" + name: "Switch to light mode" extra_css: - "css/mkdocstrings.css" markdown_extensions: +- "admonition" +- "footnotes" +- "pymdownx.emoji" - "pymdownx.highlight": use_pygments: true -- "pymdownx.superfences": - custom_fences: - - name: "mermaid" - class: "mermaid" - format: !!python/name:pymdownx.superfences.fence_code_format +- "pymdownx.magiclink" +- "pymdownx.superfences" - "toc": permalink: true -- "admonition" -- "pymdownx.emoji" -- "pymdownx.magiclink" -- "footnotes" plugins: - "autorefs" - "search" - "markdown-exec" -- "mkdocstrings" \ No newline at end of file +- "mkdocstrings": + handlers: + python: + options: + docstring_style: "numpy" + members_order: "source" + show_signature_annotations: true + paths: ["project/"] + import: + - "https://docs.python.org/3/objects.inv" diff --git a/news/.gitignore b/news/.gitignore new file mode 100644 index 0000000..1e22ff3 --- /dev/null +++ b/news/.gitignore @@ -0,0 +1,5 @@ +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/news/.gitignore.jinja + +!.gitignore \ No newline at end of file diff --git a/playground/.gitkeep b/playground/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/poetry.lock b/poetry.lock index 69dfe99..7d624b5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,13 +2,13 @@ [[package]] name = "anyio" -version = "4.2.0" +version = "4.3.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false python-versions = ">=3.8" files = [ - {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, - {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, + {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"}, + {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"}, ] [package.dependencies] @@ -22,6 +22,21 @@ doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphin test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] trio = ["trio (>=0.23)"] +[[package]] +name = "astunparse" +version = "1.6.3" +description = "An AST unparser for Python" +optional = false +python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] + +[package.dependencies] +six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" + [[package]] name = "babel" version = "2.14.0" @@ -41,15 +56,79 @@ dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] +[package.dependencies] +pycparser = "*" + [[package]] name = "cfgv" version = "3.4.0" @@ -185,70 +264,138 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "covdefaults" +version = "2.3.0" +description = "A coverage plugin to provide sensible default settings" +optional = false +python-versions = ">=3.7" +files = [ + {file = "covdefaults-2.3.0-py2.py3-none-any.whl", hash = "sha256:2832961f6ffcfe4b57c338bc3418a3526f495c26fb9c54565409c5532f7c41be"}, + {file = "covdefaults-2.3.0.tar.gz", hash = "sha256:4e99f679f12d792bc62e5510fa3eb59546ed47bd569e36e4fddc4081c9c3ebf7"}, +] + +[package.dependencies] +coverage = ">=6.0.2" + [[package]] name = "coverage" -version = "7.4.0" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, - {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, - {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, - {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, - {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, - {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, - {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, - {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, - {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, - {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, - {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, - {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, - {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, - {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, - {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, - {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, - {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, - {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, - {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, - {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, - {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, - {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, - {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, - {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, - {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, - {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, - {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, - {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.extras] toml = ["tomli"] +[[package]] +name = "cryptography" +version = "42.0.5" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + [[package]] name = "distlib" version = "0.3.8" @@ -276,18 +423,18 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.13.1" +version = "3.13.3" description = "A platform independent file lock." optional = false python-versions = ">=3.8" files = [ - {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, - {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, + {file = "filelock-3.13.3-py3-none-any.whl", hash = "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb"}, + {file = "filelock-3.13.3.tar.gz", hash = "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] typing = ["typing-extensions (>=4.8)"] [[package]] @@ -309,16 +456,17 @@ dev = ["flake8", "markdown", "twine", "wheel"] [[package]] name = "griffe" -version = "0.38.1" +version = "0.42.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.8" files = [ - {file = "griffe-0.38.1-py3-none-any.whl", hash = "sha256:334c79d3b5964ade65c05dfcaf53518c576dedd387aaba5c9fd71212f34f1483"}, - {file = "griffe-0.38.1.tar.gz", hash = "sha256:bd68d7da7f3d87bc57eb9962b250db123efd9bbcc06c11c1a91b6e583b2a9361"}, + {file = "griffe-0.42.1-py3-none-any.whl", hash = "sha256:7e805e35617601355edcac0d3511cedc1ed0cb1f7645e2d336ae4b05bbae7b3b"}, + {file = "griffe-0.42.1.tar.gz", hash = "sha256:57046131384043ed078692b85d86b76568a686266cc036b9b56b704466f803ce"}, ] [package.dependencies] +astunparse = {version = ">=1.6", markers = "python_version < \"3.9\""} colorama = ">=0.4" [[package]] @@ -334,13 +482,13 @@ files = [ [[package]] name = "httpcore" -version = "1.0.2" +version = "1.0.4" description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpcore-1.0.2-py3-none-any.whl", hash = "sha256:096cc05bca73b8e459a1fc3dcf585148f63e534eae4339559c9b8a8d6399acc7"}, - {file = "httpcore-1.0.2.tar.gz", hash = "sha256:9fc092e4799b26174648e54b74ed5f683132a464e95643b226e00c2ed2fa6535"}, + {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"}, + {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"}, ] [package.dependencies] @@ -351,17 +499,17 @@ h11 = ">=0.13,<0.15" asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -trio = ["trio (>=0.22.0,<0.23.0)"] +trio = ["trio (>=0.22.0,<0.25.0)"] [[package]] name = "httpx" -version = "0.26.0" +version = "0.27.0" description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, - {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] @@ -379,13 +527,13 @@ socks = ["socksio (==1.*)"] [[package]] name = "identify" -version = "2.5.33" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, - {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -404,32 +552,32 @@ files = [ [[package]] name = "importlib-metadata" -version = "7.0.1" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, - {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.1.1" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, - {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] @@ -437,7 +585,7 @@ zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "incremental" @@ -465,15 +613,48 @@ files = [ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] +[[package]] +name = "jaraco-classes" +version = "3.3.1" +description = "Utility functions for Python class constructs" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jaraco.classes-3.3.1-py3-none-any.whl", hash = "sha256:86b534de565381f6b3c1c830d13f931d7be1a75f0081c57dff615578676e2206"}, + {file = "jaraco.classes-3.3.1.tar.gz", hash = "sha256:cb28a5ebda8bc47d8c8015307d93163464f9f2b91ab4006e09ff0ce07e8bfb30"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -482,15 +663,39 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "keyring" +version = "24.3.1" +description = "Store and access your passwords safely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "keyring-24.3.1-py3-none-any.whl", hash = "sha256:df38a4d7419a6a60fea5cef1e45a948a3e8430dd12ad88b0f423c5c143906218"}, + {file = "keyring-24.3.1.tar.gz", hash = "sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab (>=1.1.0)"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [[package]] name = "markdown" -version = "3.5.1" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, - {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.dependencies] @@ -502,13 +707,13 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markdown-exec" -version = "1.7.0" +version = "1.8.0" description = "Utilities to execute code blocks in Markdown files." optional = false python-versions = ">=3.8" files = [ - {file = "markdown_exec-1.7.0-py3-none-any.whl", hash = "sha256:8f18d44dc055b11751f744978ea2dee6ff28dbc48ba50146b9056b11a19c9560"}, - {file = "markdown_exec-1.7.0.tar.gz", hash = "sha256:d764cc50fa03be01f5f2fb96e6bf30b8cd0c93537bae985447b45f3b3c902de1"}, + {file = "markdown_exec-1.8.0-py3-none-any.whl", hash = "sha256:e80cb766eff8d0bcd1cdd133dba58223b42edbd1b7b9672481c2189572401bff"}, + {file = "markdown_exec-1.8.0.tar.gz", hash = "sha256:0a932312f0ca89b82150e1638e84febb90eadd410dfd2417f05759c06deed727"}, ] [package.dependencies] @@ -519,61 +724,71 @@ ansi = ["pygments-ansi-color"] [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] @@ -620,28 +835,29 @@ min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-imp [[package]] name = "mkdocs-autorefs" -version = "0.5.0" +version = "1.0.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, - {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, + {file = "mkdocs_autorefs-1.0.1-py3-none-any.whl", hash = "sha256:aacdfae1ab197780fb7a2dac92ad8a3d8f7ca8049a9cbe56a4218cd52e8da570"}, + {file = "mkdocs_autorefs-1.0.1.tar.gz", hash = "sha256:f684edf847eced40b570b57846b15f0bf57fb93ac2c510450775dcf16accb971"}, ] [package.dependencies] Markdown = ">=3.3" +markupsafe = ">=2.0.1" mkdocs = ">=1.1" [[package]] name = "mkdocs-material" -version = "9.5.3" +version = "9.5.15" description = "Documentation that simply works" optional = false python-versions = ">=3.8" files = [ - {file = "mkdocs_material-9.5.3-py3-none-any.whl", hash = "sha256:76c93a8525cceb0b395b9cedab3428bf518cf6439adef2b940f1c1574b775d89"}, - {file = "mkdocs_material-9.5.3.tar.gz", hash = "sha256:5899219f422f0a6de784232d9d40374416302ffae3c160cacc72969fcc1ee372"}, + {file = "mkdocs_material-9.5.15-py3-none-any.whl", hash = "sha256:e5c96dec3d19491de49ca643fc1dbb92b278e43cdb816c775bc47db77d9b62fb"}, + {file = "mkdocs_material-9.5.15.tar.gz", hash = "sha256:39f03cca45e82bf54eb7456b5a18bd252eabfdd67f237a229471484a0a4d4635"}, ] [package.dependencies] @@ -658,8 +874,8 @@ regex = ">=2022.4" requests = ">=2.26,<3.0" [package.extras] -git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] -imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.0)"] recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] [[package]] @@ -675,13 +891,13 @@ files = [ [[package]] name = "mkdocstrings" -version = "0.24.0" +version = "0.24.1" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings-0.24.0-py3-none-any.whl", hash = "sha256:f4908560c10f587326d8f5165d1908817b2e280bbf707607f601c996366a2264"}, - {file = "mkdocstrings-0.24.0.tar.gz", hash = "sha256:222b1165be41257b494a9d29b14135d2b7ca43f38161d5b10caae03b87bd4f7e"}, + {file = "mkdocstrings-0.24.1-py3-none-any.whl", hash = "sha256:b4206f9a2ca8a648e222d5a0ca1d36ba7dee53c88732818de183b536f9042b5d"}, + {file = "mkdocstrings-0.24.1.tar.gz", hash = "sha256:cc83f9a1c8724fc1be3c2fa071dd73d91ce902ef6a79710249ec8d0ee1064401"}, ] [package.dependencies] @@ -704,53 +920,64 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] [[package]] name = "mkdocstrings-python" -version = "1.7.5" +version = "1.8.0" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.8" files = [ - {file = "mkdocstrings_python-1.7.5-py3-none-any.whl", hash = "sha256:5f6246026353f0c0785135db70c3fe9a5d9318990fc7ceb11d62097b8ffdd704"}, - {file = "mkdocstrings_python-1.7.5.tar.gz", hash = "sha256:c7d143728257dbf1aa550446555a554b760dcd40a763f077189d298502b800be"}, + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, ] [package.dependencies] griffe = ">=0.37" mkdocstrings = ">=0.20" +[[package]] +name = "more-itertools" +version = "10.2.0" +description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.8" +files = [ + {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, + {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, +] + [[package]] name = "mypy" -version = "1.8.0" +version = "1.9.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, - {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, - {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, - {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, - {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, - {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, - {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, - {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, - {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, - {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, - {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, - {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, - {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, - {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, - {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, - {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, - {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, - {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, - {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, - {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, - {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, - {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, - {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, ] [package.dependencies] @@ -791,13 +1018,13 @@ setuptools = "*" [[package]] name = "packaging" -version = "23.2" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -834,28 +1061,28 @@ files = [ [[package]] name = "platformdirs" -version = "4.1.0" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, - {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "pluggy" -version = "1.3.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.8" files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -898,6 +1125,17 @@ nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + [[package]] name = "pygments" version = "2.17.2" @@ -915,13 +1153,13 @@ windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pymdown-extensions" -version = "10.7" +version = "10.7.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.8" files = [ - {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, - {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, + {file = "pymdown_extensions-10.7.1-py3-none-any.whl", hash = "sha256:f5cc7000d7ff0d1ce9395d216017fa4df3dde800afb1fb72d1c7d3fd35e710f4"}, + {file = "pymdown_extensions-10.7.1.tar.gz", hash = "sha256:c70e146bdd83c744ffc766b4671999796aba18842b268510a329f7f64700d584"}, ] [package.dependencies] @@ -933,13 +1171,13 @@ extra = ["pygments (>=2.12)"] [[package]] name = "pytest" -version = "7.4.4" +version = "8.1.1" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, - {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, + {file = "pytest-8.1.1-py3-none-any.whl", hash = "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7"}, + {file = "pytest-8.1.1.tar.gz", hash = "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044"}, ] [package.dependencies] @@ -947,21 +1185,40 @@ colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +pluggy = ">=1.4,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-doctestplus" +version = "1.2.1" +description = "Pytest plugin with advanced doctest features." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-doctestplus-1.2.1.tar.gz", hash = "sha256:2472a8a2c8cea34d2f65f6499543faeb748eecb59c597852fd98839b47307679"}, + {file = "pytest_doctestplus-1.2.1-py3-none-any.whl", hash = "sha256:103705daee8d4468eb59d444c29b0d71eb85b8f6d582295c8bc3d68ee1d88911"}, +] + +[package.dependencies] +packaging = ">=17.0" +pytest = ">=4.6" +setuptools = ">=30.3.0" [package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +test = ["numpy", "pytest-remotedata (>=0.3.2)", "sphinx"] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -969,13 +1226,24 @@ six = ">=1.5" [[package]] name = "pytz" -version = "2023.3.post1" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, - {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, ] [[package]] @@ -990,6 +1258,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -997,8 +1266,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -1015,6 +1292,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -1022,6 +1300,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -1166,45 +1445,60 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "ruff" -version = "0.1.9" +version = "0.2.2" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" files = [ - {file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e6a212f436122ac73df851f0cf006e0c6612fe6f9c864ed17ebefce0eff6a5fd"}, - {file = "ruff-0.1.9-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:28d920e319783d5303333630dae46ecc80b7ba294aeffedf946a02ac0b7cc3db"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:104aa9b5e12cb755d9dce698ab1b97726b83012487af415a4512fedd38b1459e"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1e63bf5a4a91971082a4768a0aba9383c12392d0d6f1e2be2248c1f9054a20da"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d0738917c203246f3e275b37006faa3aa96c828b284ebfe3e99a8cb413c8c4b"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:69dac82d63a50df2ab0906d97a01549f814b16bc806deeac4f064ff95c47ddf5"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2aec598fb65084e41a9c5d4b95726173768a62055aafb07b4eff976bac72a592"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:744dfe4b35470fa3820d5fe45758aace6269c578f7ddc43d447868cfe5078bcb"}, - {file = "ruff-0.1.9-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:479ca4250cab30f9218b2e563adc362bd6ae6343df7c7b5a7865300a5156d5a6"}, - {file = "ruff-0.1.9-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:aa8344310f1ae79af9ccd6e4b32749e93cddc078f9b5ccd0e45bd76a6d2e8bb6"}, - {file = "ruff-0.1.9-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:837c739729394df98f342319f5136f33c65286b28b6b70a87c28f59354ec939b"}, - {file = "ruff-0.1.9-py3-none-musllinux_1_2_i686.whl", hash = "sha256:e6837202c2859b9f22e43cb01992373c2dbfeae5c0c91ad691a4a2e725392464"}, - {file = "ruff-0.1.9-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:331aae2cd4a0554667ac683243b151c74bd60e78fb08c3c2a4ac05ee1e606a39"}, - {file = "ruff-0.1.9-py3-none-win32.whl", hash = "sha256:8151425a60878e66f23ad47da39265fc2fad42aed06fb0a01130e967a7a064f4"}, - {file = "ruff-0.1.9-py3-none-win_amd64.whl", hash = "sha256:c497d769164df522fdaf54c6eba93f397342fe4ca2123a2e014a5b8fc7df81c7"}, - {file = "ruff-0.1.9-py3-none-win_arm64.whl", hash = "sha256:0e17f53bcbb4fff8292dfd84cf72d767b5e146f009cccd40c2fad27641f8a7a9"}, - {file = "ruff-0.1.9.tar.gz", hash = "sha256:b041dee2734719ddbb4518f762c982f2e912e7f28b8ee4fe1dee0b15d1b6e800"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, + {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, + {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, + {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, + {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, +] + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + [[package]] name = "setuptools" -version = "69.0.3" +version = "69.2.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, - {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, + {file = "setuptools-69.2.0-py3-none-any.whl", hash = "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c"}, + {file = "setuptools-69.2.0.tar.gz", hash = "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -1234,13 +1528,13 @@ typer = ">=0.8.0" [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -1277,61 +1571,59 @@ dev = ["furo", "packaging", "sphinx (>=5)", "twisted"] [[package]] name = "typer" -version = "0.9.0" +version = "0.11.0" description = "Typer, build great CLIs. Easy to code. Based on Python type hints." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, - {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, + {file = "typer-0.11.0-py3-none-any.whl", hash = "sha256:049cc47bef39f46b043eddd9165492209fdd9bc7d79afa7ba9cc5cd017caa817"}, + {file = "typer-0.11.0.tar.gz", hash = "sha256:a6ce173c0f03d3a41b49c0a945874cc489e91f88faabf76517b2b91c670fcde7"}, ] [package.dependencies] -click = ">=7.1.1,<9.0.0" +click = ">=8.0.0" typing-extensions = ">=3.7.4.3" [package.extras] all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] -dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] -doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] -test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.10.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"}, + {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"}, ] [[package]] name = "urllib3" -version = "2.1.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, - {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.25.0" +version = "20.25.1" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, - {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, + {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"}, + {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"}, ] [package.dependencies] @@ -1345,59 +1637,75 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess [[package]] name = "watchdog" -version = "3.0.0" +version = "4.0.0" description = "Filesystem events monitoring" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, - {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, - {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, - {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, - {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, - {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, - {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, - {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, - {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, - {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, - {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, - {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, - {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, - {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, ] [package.extras] watchmedo = ["PyYAML (>=3.10)"] +[[package]] +name = "wheel" +version = "0.43.0" +description = "A built-package format for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] + [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" -python-versions = ">=3.8,<=3.12" -content-hash = "3e96b5d4faa2fcd7e79710be2550a88660a3345a46e6528c33c14b10367ac236" +python-versions = ">=3.8,<4.0" +content-hash = "9a9163867b4be788559345641bf96a6f9f47cc26afad334a36415b7b5ce9227c" diff --git a/project/__init__.py b/project/__init__.py index 07804bf..2f56865 100644 --- a/project/__init__.py +++ b/project/__init__.py @@ -1,7 +1,7 @@ +# SPDX-License-Identifier: MIT +# (C) 2024-present Bartosz Sławecki (bswck) """ -project. +`project`. -Automatically detect backends & initialize virtual environments for your Python repo clones. - -(C) 2023-present Bartosz Sławecki (bswck) +Set up projects for development quickly. """ diff --git a/project/__main__.py b/project/__main__.py new file mode 100644 index 0000000..ec55b70 --- /dev/null +++ b/project/__main__.py @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: MIT +# (C) 2024-present Bartosz Sławecki (bswck) +""" +`project`. + +Entrypoint script. +""" +from __future__ import annotations + + +def main() -> None: + """Run the `project` package as an app.""" + + +if __name__ == "__main__": + main() diff --git a/pyproject.toml b/pyproject.toml index acfa053..bf1ce36 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,17 +1,20 @@ -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/pyproject.toml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/pyproject.toml.jinja [tool.poetry] name = "project" version = "0.0.0" -description = "Automatically detect backends & initialize virtual environments for your Python repo clones." -authors = ["bswck "] +description = "Set up projects for development quickly." +authors = ["bswck "] license = "MIT" readme = "README.md" packages = [{ include = "project/" }] homepage = "https://github.com/bswck/project" +[tool.poetry.scripts] +project = "project.__main__:main" + [tool.poetry.urls] Documentation = "https://project.readthedocs.io/en/latest/" Issues = "https://github.com/bswck/project/issues" @@ -19,22 +22,29 @@ Distribution = "https://pypi.org/project/project/" Coverage = "https://coverage-badge.samuelcolvin.workers.dev/redirect/bswck/project" [tool.poetry.dependencies] -python = ">=3.8,<=3.12" +python = ">=3.8,<4.0" [tool.poetry.group.dev.dependencies] [tool.poetry.group.dev-skeleton.dependencies] -# This dependency group was generated from bswck/skeleton@bf2dfcf. +# This dependency group was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/pyproject.toml.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/pyproject.toml.jinja mypy = "^1.7.0" -ruff = "^0.1.2" +ruff = "^0.2.2" towncrier = "^23.11.0" -pytest = "^7.4.3" -coverage = "^7.3.2" +coverage = "^7.4.2" +pytest = "^8.0.1" +pytest-doctestplus = "^1.1.0" +covdefaults = "^2.3.0" poethepoet = "^0.24.3" -pre-commit = "^3.5.0" +pre-commit = "<3.6.0" smokeshow = "^0.4.0" +keyring = "^24.3.0" + +[tool.pytest.ini_options] +addopts = "--doctest-modules" + [tool.poetry.group.docs] optional = true @@ -46,7 +56,7 @@ mkdocstrings = { version = ">=0.19.0", extras = ["python"] } [tool.poe.tasks] test = "pytest -v" lint = "ruff check ." -skeleton = "scripts/bf2dfcf.sh" +skeleton = "scripts/skeleton.0.0.2rc-180-g2a2d737.bash" check = [ { ref="test" }, { ref="lint" }, @@ -55,30 +65,32 @@ release.script = "scripts.release:main" [tool.poe.tasks.added] shell = "towncrier create $TICKET.added.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.poe.tasks.changed] shell = "towncrier create $TICKET.changed.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.poe.tasks.fixed] shell = "towncrier create $TICKET.fixed.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.poe.tasks.deprecated] shell = "towncrier create $TICKET.deprecated.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.poe.tasks.removed] shell = "towncrier create $TICKET.removed.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.poe.tasks.security] shell = "towncrier create $TICKET.security.md --edit" -args = [{name = "TICKET", positional = true}] +args = [{name = "TICKET", default = "+", positional = true}] [tool.ruff] exclude = ["tests/", "scripts/"] + +[tool.ruff.lint] # To discuss the presented rationales, contact the author (bswck). select = ["ALL"] ignore = [ @@ -111,6 +123,9 @@ ignore = [ "FIX002", ] +[tool.ruff.lint.isort] +required-imports = ["from __future__ import annotations"] + [tool.mypy] strict = true @@ -118,7 +133,7 @@ strict = true profile = "black" [tool.towncrier] -directory = "changes" +directory = "news" package = "project" filename = "CHANGELOG.md" start_string = "\n" @@ -156,17 +171,13 @@ directory = "fixed" name = "Fixed" showcontent = true +[tool.coverage.run] +plugins = ["covdefaults"] +source = ["project/"] +relative_files = true + [tool.coverage.report] -omit = ["tests/*"] -# fail_under = 96 -exclude_also = [ - # Be sure to include lines that are not meant to be covered - # by tests or encountered by the users at runtime. - "raise NotImplementedError", # Do not cover abstract methods. - "if ((t|typing)\\.?)?TYPE_CHECKING:", # Do not cover type checking imports. - "@((t|typing)\\.?)?overload", # Do not cover overload definitions. - "\\(((t|typing)\\.?)?Protocol\\):$", # Do not cover entire protocol definitions. -] +fail_under = 90 [build-system] requires = ["poetry-core"] diff --git a/scripts/bf2dfcf.sh b/scripts/bf2dfcf.sh deleted file mode 100755 index 3e7e975..0000000 --- a/scripts/bf2dfcf.sh +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env bash -# (C) 2023–present Bartosz Sławecki (bswck) -# -# Interact with bswck/skeleton (current version: https://github.com/bswck/skeleton/tree/bf2dfcf). -# -# This file was generated from bswck/skeleton@bf2dfcf. -# Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/scripts/%7B%7Bsref%7D%7D.sh.jinja -# -# Usage: -# -# To update to the latest version: -# $ poe skeleton upgrade -# -# To update to version 1.2.3: -# $ poe skeleton upgrade 1.2.3 -# -# To make a mechanized repo patch, but keep the current skeleton version: -# $ poe skeleton patch -# -# It's intended to be impossible to make a mechanized repo patch and update the skeleton -# at the same time. - -# shellcheck disable=SC2005 -# Automatically copied from https://github.com/bswck/skeleton/tree/bf2dfcf/handle-task-event.sh -setup_gh() { - echo "Calling GitHub setup hooks..." - supply_smokeshow_key -} - -determine_project_path() { - # Determine the project path set by the preceding copier task process - export PROJECT_PATH - PROJECT_PATH=$(redis-cli get "$PROJECT_PATH_KEY") -} - -ensure_gh_environment() { - # Ensure that the GitHub environment exists - echo "$(jq -n '{"deployment_branch_policy": {"protected_branches": false,"custom_branch_policies": true}}' | gh api -H "Accept: application/vnd.github+json" -X PUT "/repos/bswck/project/environments/$1" --input -)" > /dev/null 2>&1 || return 1 -} - -supply_smokeshow_key() { - # Supply smokeshow key to the repository - echo "Checking if smokeshow secret needs to be created..." - ensure_gh_environment "Smokeshow" - if test "$(gh secret list -e Smokeshow | grep -o SMOKESHOW_AUTH_KEY)" - then - echo "Smokeshow secret already exists, aborting." && return 0 - fi - echo "Smokeshow secret does not exist, creating..." - SMOKESHOW_AUTH_KEY=$(smokeshow generate-key | grep SMOKESHOW_AUTH_KEY | grep -oP "='\K[^']+") - gh secret set SMOKESHOW_AUTH_KEY --env Smokeshow --body "$SMOKESHOW_AUTH_KEY" 2> /dev/null - if test $? = 0 - then - echo "Smokeshow secret created." - else - echo "Failed to create smokeshow secret." 1>&2 - fi -} -# End of copied code - -determine_new_ref() { - # Determine the new skeleton revision set by the child process - export NEW_REF - NEW_REF=$(redis-cli get "$NEW_REF_KEY") -} - -before_update_algorithm() { - # Stash changes if any - if test "$(git status --porcelain)" - then - echo "There are uncommitted changes in the project." 1>&2 - echo "Stash them and continue." 1>&2 - return 1 - else - echo "Working tree clean, no need to stash." - fi -} - -run_update_algorithm() { - # Run the underlying update algorithm - export MODE - SKELETON_COMMAND="${1:-"upgrade"}" - if test "$SKELETON_COMMAND" = "upgrade" - then - copier update --trust --vcs-ref "${2:-"HEAD"}" --defaults || return 1 - elif test "$SKELETON_COMMAND" = "patch" - then - # shellcheck disable=SC2068 - copier update --trust --vcs-ref "$LAST_REF" ${@:3} || return 1 - else - echo "Unknown update algorithm: '$1'" - return 1 - fi - determine_new_ref - determine_project_path -} - -after_update_algorithm() { - # Run post-update hooks, auto-commit changes - cd "$PROJECT_PATH" || exit 1 - echo "Previous skeleton revision: $LAST_REF" - echo "Current skeleton revision: ${NEW_REF:-"N/A"}" - local REVISION_PARAGRAPH="Skeleton revision: https://github.com/bswck/skeleton/tree/${NEW_REF:-"HEAD"}" - git add . - if test "$LAST_REF" = "$NEW_REF" - then - echo "The version of the skeleton has not changed." - local COMMIT_MSG="Mechanized patch at bswck/skeleton@$NEW_REF" - else - if test "$NEW_REF" - then - local COMMIT_MSG="Upgrade to bswck/skeleton@$NEW_REF" - else - local COMMIT_MSG="Upgrade to bswck/skeleton of unknown revision" - fi - fi - redis-cli del "$PROJECT_PATH_KEY" > /dev/null 2>&1 - redis-cli del "$NEW_REF_KEY" > /dev/null 2>&1 - echo "Press ENTER to commit the changes or CTRL+C to abort." - read -r || exit 1 - git commit --no-verify -m "$COMMIT_MSG" -m "$REVISION_PARAGRAPH" - setup_gh -} - -main() { - export LAST_REF="bf2dfcf" - export PROJECT_PATH_KEY="$$_skeleton_project_path" - export NEW_REF_KEY="$$_skeleton_new_ref" - export LAST_LICENSE_NAME="MIT" - cd "${PROJECT_PATH:=$(git rev-parse --show-toplevel)}" || exit 1 - echo - echo "--- Last skeleton revision: $LAST_REF" - echo - echo "UPGRADE ROUTINE [1/3]: Running pre-update hooks." - echo "[----------------------------------------------]" - before_update_algorithm || exit 1 - echo "[----------------------------------------------]" - echo "UPGRADE ROUTINE [1/3] COMPLETE. ✅" - echo - echo "UPGRADE ROUTINE [2/3]: Running the underlying update algorithm." - echo "[-------------------------------------------------------------]" - run_update_algorithm "$@" || exit 1 - echo "[-------------------------------------------------------------]" - echo "UPGRADE ROUTINE [2/3] COMPLETE. ✅" - echo - echo "--- Project path: $PROJECT_PATH" - echo - echo "UPGRADE ROUTINE [3/3]: Running post-update hooks." - echo "[-----------------------------------------------]" - after_update_algorithm - echo "[-----------------------------------------------]" - echo "UPGRADE ROUTINE [3/3] COMPLETE. ✅" - echo - echo "Done! 🎉" - echo - echo "Your repository is now up to date with this bswck/skeleton revision:" - echo "https://github.com/bswck/skeleton/tree/${NEW_REF:-"HEAD"}" -} - -main "$@" \ No newline at end of file diff --git a/scripts/release.py b/scripts/release.py index 63e0860..a99849c 100644 --- a/scripts/release.py +++ b/scripts/release.py @@ -1,9 +1,9 @@ #!/usr/bin/env python # (C) 2023–present Bartosz Sławecki (bswck) # -# This file was generated from bswck/skeleton@bf2dfcf. +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. # Instead of changing this particular file, you might want to alter the template: -# https://github.com/bswck/skeleton/tree/bf2dfcf/project/scripts/release.py.jinja +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/scripts/release.py.jinja # """ Automate the release process by updating local files, creating and pushing a new tag. @@ -12,7 +12,7 @@ GitHub Actions workflow will publish the package to PyPI via Trusted Publisher. Usage: -$ poe release [major|minor|patch|MAJOR.MINOR.PATCH] +`$ poe release [major|minor|patch|MAJOR.MINOR.PATCH]` """ from __future__ import annotations @@ -62,9 +62,7 @@ def _setup_logging() -> None: def _command(prompt: str, /) -> str: data = subprocess.check_output(prompt, shell=True, text=True) - if data[-1:] == "\n": - data = data[:-1] - return data + return data[: -(data[-1:] == "\n") or None] def _run(*prompt: str) -> None: @@ -72,8 +70,14 @@ def _run(*prompt: str) -> None: subprocess.run([*prompt], check=True) -def release(version: str, /) -> None: +def release(version: str, /, next_version: str = "patch") -> None: """Release a semver version.""" + print(welcome_msg := "Simple release utility.".title()) + print("-" * len(welcome_msg)) + _LOGGER.info("Release version: %s", version) + _LOGGER.info("Post-release version: %s", next_version) + + _run("pre-commit", "run", "--all-files", "--hook-stage", "pre-push") changed_files = _command("git status --porcelain") if changed_files: @@ -165,20 +169,44 @@ def release(version: str, /) -> None: ) _run( - "gh", "release", "create", new_version, "--generate-notes", - "--notes-file", temp_file.name, + "gh", + "release", + "create", + new_version, + "--generate-notes", + "--notes-file", + temp_file.name, ) os.unlink(temp_file.name) else: _run("gh", "release", "create", new_version, "--generate-notes") + _LOGGER.info("Done.") + _LOGGER.info("Bumping to the next patch version...") + _run("poetry", "version", next_version) + def main(argv: list[str] | None = None) -> None: """Run the script.""" _setup_logging() + current_version = _command("poetry version --short") parser = argparse.ArgumentParser(description="Release a semver version.") - parser.add_argument("version", type=str) + parser.add_argument( + "version", + nargs="?", + default=current_version, + help=( + "The version to release. Defaults to the " + f"current version ({current_version})" + ), + ) + parser.add_argument( + "-n", + "--next", + dest="next_version", + default="patch", + ) release(*vars(parser.parse_args(argv)).values()) diff --git a/scripts/skeleton.0.0.2rc-180-g2a2d737.bash b/scripts/skeleton.0.0.2rc-180-g2a2d737.bash new file mode 100755 index 0000000..a68241e --- /dev/null +++ b/scripts/skeleton.0.0.2rc-180-g2a2d737.bash @@ -0,0 +1,179 @@ +#!/usr/bin/env bash +# (C) 2023–present Bartosz Sławecki (bswck) +# +# Interact with bswck/skeleton (current version: https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737). +# +# This file was generated from bswck/skeleton@0.0.2rc-180-g2a2d737. +# Instead of changing this particular file, you might want to alter the template: +# https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737/project/scripts/skeleton.%7B%7Bsref%7D%7D.bash.jinja +# +# Usage: +# +# To update to the latest version: +# $ poe skeleton upgrade +# +# To update to version 1.2.3: +# $ poe skeleton upgrade 1.2.3 +# +# To make a mechanized repo patch, but keep the current skeleton version: +# $ poe skeleton patch +# +# It's intended to be impossible to make a mechanized repo patch and update the skeleton +# at the same time. + +# shellcheck disable=SC2005,SC1091 + +set -eEuo pipefail + +TEMPFILE=$(mktemp) + +curl "https://raw.githubusercontent.com/bswck/skeleton/HEAD/setup.bash" > "$TEMPFILE" +trap 'builtin command rm -f "$TEMPFILE"' EXIT + +# shellcheck disable=SC1090 +source "$TEMPFILE" + +make_context() { + export POETRY_VERSION + POETRY_VERSION=$(cat <<- 'EOF' + 1.7.1 + EOF + ) + export GIT_USERNAME + GIT_USERNAME=$(cat <<- 'EOF' + bswck + EOF + ) + export GIT_EMAIL + GIT_EMAIL=$(cat <<- 'EOF' + bswck.dev@gmail.com + EOF + ) + export VISIBILITY + VISIBILITY=$(cat <<- 'EOF' + public + EOF + ) + export PUBLIC + PUBLIC=$(cat <<- 'EOF' + True + EOF + ) + export PRIVATE + PRIVATE=$(cat <<- 'EOF' + False + EOF + ) + export LATEST_PYTHON + LATEST_PYTHON=$(cat <<- 'EOF' + 3.12 + EOF + ) + export PYTHON_AHEAD + PYTHON_AHEAD=$(cat <<- 'EOF' + 3.13 + EOF + ) + export PYTHON + PYTHON=$(cat <<- 'EOF' + 3.8 + EOF + ) + export PYPY + PYPY=$(cat <<- 'EOF' + True + EOF + ) + export PYTHONS + PYTHONS=$(cat <<- 'EOF' + "3.8", "3.9", "3.10", "3.11", "3.12", "pypy3.8", "pypy3.9", "pypy3.10" + EOF + ) + export REPO_URL + REPO_URL=$(cat <<- 'EOF' + https://github.com/bswck/project + EOF + ) + export COVERAGE_URL + COVERAGE_URL=$(cat <<- 'EOF' + https://coverage-badge.samuelcolvin.workers.dev/redirect/bswck/project + EOF + ) + export DOCS_URL + DOCS_URL=$(cat <<- 'EOF' + https://project.readthedocs.io/en/latest/ + EOF + ) + export PYPI_URL + PYPI_URL=$(cat <<- 'EOF' + https://pypi.org/project/project/ + EOF + ) + export TIDELIFT_URL + TIDELIFT_URL=$(cat <<- 'EOF' + https://tidelift.com/subscription/pkg/pypi-project?utm_source=pypi-project + EOF + ) + export SKELETON + SKELETON=$(cat <<- 'EOF' + bswck/skeleton + EOF + ) + export SKELETON_URL + SKELETON_URL=$(cat <<- 'EOF' + https://github.com/bswck/skeleton + EOF + ) + export RAW_SKELETON_URL + RAW_SKELETON_URL=$(cat <<- 'EOF' + https://raw.githubusercontent.com/bswck/skeleton + EOF + ) + export SKELETON_REF + SKELETON_REF=$(cat <<- 'EOF' + 0.0.2rc-180-g2a2d737 + EOF + ) + export SREF + SREF=$(cat <<- 'EOF' + 0.0.2rc-180-g2a2d737 + EOF + ) + export SKELETON_REV + SKELETON_REV=$(cat <<- 'EOF' + https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737 + EOF + ) + export SREV + SREV=$(cat <<- 'EOF' + https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737 + EOF + ) + export SKELETON_AND_REF + SKELETON_AND_REF=$(cat <<- 'EOF' + bswck/skeleton@0.0.2rc-180-g2a2d737 + EOF + ) + export SNREF + SNREF=$(cat <<- 'EOF' + bswck/skeleton@0.0.2rc-180-g2a2d737 + EOF + ) + export GH_REPO_ARGS + GH_REPO_ARGS=$(cat <<- 'EOF' + "bswck/project" --public --source=./ --remote=upstream --description="Set up projects for development quickly." + EOF + ) + export GH_ENSURE_ENV + GH_ENSURE_ENV=$(cat <<- 'EOF' + jq -n '{"deployment_branch_policy": {"protected_branches": false,"custom_branch_policies": true}}' | gh api -H "Accept: application/vnd.github+json" -X PUT "/repos/bswck/project/environments/$1" --silent --input - + EOF + ) + export LAST_REF="0.0.2rc-180-g2a2d737" + export PROJECT_PATH_KEY="$$_skeleton_project_path" + export NEW_REF_KEY="$$_skeleton_new_ref" + export LAST_LICENSE_NAME="MIT" +} + +make_context +update_entrypoint "$@" diff --git a/setup-local.bash b/setup-local.bash new file mode 100755 index 0000000..9168c3e --- /dev/null +++ b/setup-local.bash @@ -0,0 +1,560 @@ +#!/usr/bin/env bash +# (C) 2023–present Bartosz Sławecki (bswck) +# +# This script is run on every copier task event. +# Implemented as a workaround for copier-org/copier#240. +# https://github.com/copier-org/copier/issues/240 +# +# Usage: +# $ copier copy --trust --vcs-ref HEAD gh:bswck/skeleton project +# Later on, this script will be included in your project and run automatically within: +# $ poe skeleton upgrade + +# shellcheck shell=bash +# shellcheck disable=SC1054,SC1073,SC2005,SC1083 + +set -eEuo pipefail + +BOLD="\033[1m" +RED="\033[0;31m" +GREEN="\033[0;32m" +BLUE="\033[0;34m" +GREY="\033[0;90m" +NC="\033[0m" + +UI_INFO="${BLUE}🛈${NC}" +UI_NOTE="${GREY}→${NC}" +UI_TICK="${GREEN}✔${NC}" +UI_CROSS="${RED}✘${NC}" + + +export POETRY_VERSION +POETRY_VERSION=$(cat <<- 'EOF' + 1.7.1 +EOF +) +export GIT_USERNAME +GIT_USERNAME=$(cat <<- 'EOF' + bswck +EOF +) +export GIT_EMAIL +GIT_EMAIL=$(cat <<- 'EOF' + bswck.dev@gmail.com +EOF +) +export VISIBILITY +VISIBILITY=$(cat <<- 'EOF' + public +EOF +) +export PUBLIC +PUBLIC=$(cat <<- 'EOF' + True +EOF +) +export PRIVATE +PRIVATE=$(cat <<- 'EOF' + False +EOF +) +export LATEST_PYTHON +LATEST_PYTHON=$(cat <<- 'EOF' + 3.12 +EOF +) +export PYTHON_AHEAD +PYTHON_AHEAD=$(cat <<- 'EOF' + 3.13 +EOF +) +export PYTHON +PYTHON=$(cat <<- 'EOF' + 3.8 +EOF +) +export PYPY +PYPY=$(cat <<- 'EOF' + True +EOF +) +export PYTHONS +PYTHONS=$(cat <<- 'EOF' + "3.8", "3.9", "3.10", "3.11", "3.12", "pypy3.8", "pypy3.9", "pypy3.10" +EOF +) +export REPO_URL +REPO_URL=$(cat <<- 'EOF' + https://github.com/bswck/project +EOF +) +export COVERAGE_URL +COVERAGE_URL=$(cat <<- 'EOF' + https://coverage-badge.samuelcolvin.workers.dev/redirect/bswck/project +EOF +) +export DOCS_URL +DOCS_URL=$(cat <<- 'EOF' + https://project.readthedocs.io/en/latest/ +EOF +) +export PYPI_URL +PYPI_URL=$(cat <<- 'EOF' + https://pypi.org/project/project/ +EOF +) +export TIDELIFT_URL +TIDELIFT_URL=$(cat <<- 'EOF' + https://tidelift.com/subscription/pkg/pypi-project?utm_source=pypi-project +EOF +) +export SKELETON +SKELETON=$(cat <<- 'EOF' + bswck/skeleton +EOF +) +export SKELETON_URL +SKELETON_URL=$(cat <<- 'EOF' + https://github.com/bswck/skeleton +EOF +) +export RAW_SKELETON_URL +RAW_SKELETON_URL=$(cat <<- 'EOF' + https://raw.githubusercontent.com/bswck/skeleton +EOF +) +export SKELETON_REF +SKELETON_REF=$(cat <<- 'EOF' + 0.0.2rc-180-g2a2d737 +EOF +) +export SREF +SREF=$(cat <<- 'EOF' + 0.0.2rc-180-g2a2d737 +EOF +) +export SKELETON_REV +SKELETON_REV=$(cat <<- 'EOF' + https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737 +EOF +) +export SREV +SREV=$(cat <<- 'EOF' + https://github.com/bswck/skeleton/tree/0.0.2rc-180-g2a2d737 +EOF +) +export SKELETON_AND_REF +SKELETON_AND_REF=$(cat <<- 'EOF' + bswck/skeleton@0.0.2rc-180-g2a2d737 +EOF +) +export SNREF +SNREF=$(cat <<- 'EOF' + bswck/skeleton@0.0.2rc-180-g2a2d737 +EOF +) +export GH_REPO_ARGS +GH_REPO_ARGS=$(cat <<- 'EOF' + "bswck/project" --public --source=./ --remote=upstream --description="Set up projects for development quickly." +EOF +) +export GH_ENSURE_ENV +GH_ENSURE_ENV=$(cat <<- 'EOF' + jq -n '{"deployment_branch_policy": {"protected_branches": false,"custom_branch_policies": true}}' | gh api -H "Accept: application/vnd.github+json" -X PUT "/repos/bswck/project/environments/$1" --silent --input - +EOF +) + +setup_task_event() { + # By default use PPID not to overlap with other running copier processes + export SKELETON_COMMAND + note "(Setting up task event)" + info "${GREY}Skeleton command:$NC ${SKELETON_COMMAND:="copy"}" + info "${GREY}Project path key:$NC ${PROJECT_PATH_KEY:="${PPID}_skeleton_project_path"}" + + # It is a temporary directory that copier uses before or after updating + set +eE + if test "$(pwd | grep "^/tmp/")" + then + # Before update + if test "$(pwd | grep "old_copy")" + then + export TASK_EVENT="CHECKOUT_LAST_SKELETON" + # After update + else + export TASK_EVENT="CHECKOUT_PROJECT" + fi + else + # Export the project path to parent process + silent redis-cli set "$PROJECT_PATH_KEY" "$(pwd)" + + # Does this repository exist remotely? + silent git ls-remote "$REPO_URL" HEAD + if test $? = 0 && test "${LAST_REF:=""}" # Missing $LAST_REF means we are not updating. + then + # Let the parent process know what is the new skeleton revision + set -eE + silent redis-cli set "$NEW_REF_KEY" "$SREF" + export TASK_EVENT="UPGRADE" + export BRANCH + BRANCH="$(git rev-parse --abbrev-ref HEAD)" + else + # Integrate the skeleton for the first time or even create a new repository + export TASK_EVENT="COPY" + fi + fi + set -eE + + determine_project_path + info "${GREY}Task stage:$NC $TASK_EVENT" + info "${GREY}Last skeleton revision:$NC ${LAST_REF:-"N/A"}" + info "${GREY}Project path:$NC ${PROJECT_PATH:-"N/A"}" + info "${GREY}Runner ID:$NC $PPID" + echo +} + +run_python_hook() { + # Run a temporary hook that might generate LICENSE file and other stuff + note "Running Python hook..." + builtin command env python python_hook.py + info "Python hook exited with code $BOLD$?$NC." + note "Removing Python hook..." + builtin command rm python_hook.py || (error $? "Failed to remove copier hook.") +} + +setup_poetry_virtualenv() { + # Set up Poetry virtualenv. This is needed for copier to work flawlessly. + + note "Setting Python version to ${PYTHON_VERSION:=$(cat .python-version)}..." + poetry env use "$PYTHON_VERSION" + echo + note "Running Poetry installation for the $TASK_EVENT routine..." + if test "$TASK_EVENT" = "COPY" + then + poetry update || (error $? "Failed to install dependencies.") + fi + poetry lock --no-update + + clear +} + +after_copy() { + # This is the first time the skeleton is integrated into the project. + note "Setting up the project..." + echo + setup_poetry_virtualenv + run_python_hook + silent builtin command rm -f ./setup-local.bash + + if test "$(git rev-parse --show-toplevel 2> /dev/null)" != "$(pwd)" + then + BRANCH="main" + echo + note "Initializing git repository..." + silent git init . + silent git branch -M "$BRANCH" + info "Main branch: $BRANCH" + builtin eval "gh repo create $GH_REPO_ARGS" + git remote add origin "$REPO_URL.git" + CREATED=1 + else + BRANCH="$(git rev-parse --abbrev-ref HEAD)" + fi + echo + note "Installing pre-commit..." + silent poetry run pre-commit install + success "Pre-commit installed." + COMMIT_MSG="Copy $SNREF" + REVISION_PARAGRAPH="Skeleton revision: $SKELETON_REV" + silent git add -A + silent git commit --no-verify -m "$COMMIT_MSG" -m "$REVISION_PARAGRAPH" + echo + if test "${CREATED:-0}" != 0 + then + silent git push --no-verify -u origin "$BRANCH" + setup_gh && echo + else + silent git revert --no-commit HEAD + info "Reverted the latest commit to complete the integration process." + echo "Patch your files and commit your changes with the --am option" + echo "to inform copier what needs to be kept." + echo + echo "Then run:" + echo "💲 poe skeleton upgrade" + fi + +} + +after_checkout_last_skeleton() { + run_python_hook +} + +before_update() { + : +} + +after_update() { + setup_poetry_virtualenv + run_python_hook + + poetry run pre-commit install + +} + +before_checkout_project() { + : +} + +after_checkout_project() { + run_python_hook +} + +handle_task_event() { + if test "$TASK_EVENT" = "COPY" + then + clear + note "COPY ROUTINE: Copying the skeleton." + after_copy + determine_project_path + success "COPY ROUTINE COMPLETE." + echo + + success "Done! 🎉" + info "Your repository is now set up at ${BOLD}$REPO_URL$NC" + echo -e " 💲 ${BOLD}cd $PROJECT_PATH$NC" + echo + echo "Happy coding!" + echo -e "$GREY-- bswck$NC" + silent redis-cli del "$PROJECT_PATH_KEY" + + elif test "$TASK_EVENT" = "CHECKOUT_LAST_SKELETON" + then + info "UPGRADE ALGORITHM [1/3]: Checked out the last used skeleton before update." + after_checkout_last_skeleton + before_update + success "UPGRADE ALGORITHM [1/3] COMPLETE." + echo + elif test "$TASK_EVENT" = "UPGRADE" + then + info "UPGRADE ALGORITHM [2/3]: Overwrote the old skeleton before checking out the project." + note "Re-setting up the project..." + after_update + before_checkout_project + success "UPGRADE ALGORITHM [2/3] COMPLETE." + echo + elif test "$TASK_EVENT" = "CHECKOUT_PROJECT" + then + info "UPGRADE ALGORITHM [3/3]: Checked out the project." + after_checkout_project + success "UPGRADE ALGORITHM [3/3] COMPLETE." + fi +} + +info() { + echo -e "$UI_INFO $*" +} + +note() { + echo -e "$UI_NOTE $GREY$*$NC" +} + +success() { + echo -e "$UI_TICK $*" +} + +silent() { + "$1" "${@:2}" > /dev/null 2>&1 +} + +error() { + local CODE=$1 + echo -e "$UI_CROSS ${*:2}" >&2 + return "$CODE" +} + +setup_gh() { + note "Calling GitHub setup hooks..." + echo + provision_gh_envs +} + +determine_project_path() { + # Determine the project path set by the preceding copier task process + export PROJECT_PATH + PROJECT_PATH=$(redis-cli get "$PROJECT_PATH_KEY") +} + +create_gh_env() { + # Ensure that the GitHub environment exists + eval "echo \$($GH_ENSURE_ENV)" || error 0 "Failed to ensure GitHub environment $BLUE$1$NC exists." +} + +provision_gh_envs() { + local SMOKESHOW_KEY + local CODECOV_TOKEN + local ENV_NAME="Coverage" + note "Creating a GitHub Actions environment $BLUE$ENV_NAME$GREY if necessary..." + create_gh_env "$ENV_NAME" && success "Environment $BLUE$ENV_NAME$NC exists." + echo + note "Checking if Smokeshow secret key needs to be created..." + set +eE + if test "$(gh secret list -e "$ENV_NAME" | grep -o SMOKESHOW_AUTH_KEY)" + then + note "Smokeshow secret key already set." + else + note "Smokeshow secret key does not exist yet." + note "Creating Smokeshow secret key..." + SMOKESHOW_KEY=$(smokeshow generate-key | grep SMOKESHOW_AUTH_KEY | grep -oP "='\K[^']+") + gh secret set SMOKESHOW_AUTH_KEY --env "$ENV_NAME" --body "$SMOKESHOW_KEY" 2> /dev/null || error 0 "Failed to set Smokeshow secret key." + echo + fi + note "Checking if Codecov secret token needs to be created..." + if test "$(gh secret list -e "$ENV_NAME" | grep -o CODECOV_TOKEN)" + then + note "Codecov secret key already set." + else + note "Setting Codecov secret token..." + CODECOV_TOKEN=$(keyring get codecov token) + gh secret set CODECOV_TOKEN --env "$ENV_NAME" --body "$CODECOV_TOKEN" 2> /dev/null || error 0 "Failed to set Codecov secret token." + fi + set -eE +} + +determine_new_ref() { + # Determine the new skeleton revision set by the child process + export NEW_REF + NEW_REF=$(redis-cli get "$NEW_REF_KEY") +} + +before_update_algorithm() { + # Stash changes if any + if test "$(git status --porcelain)" + then + error 0 "There are uncommitted changes in the project." + error 1 "Stash them and continue." + else + note "Working tree clean, no need to stash." + fi +} + +do_update() { + copier update --trust --vcs-ref "$1" "${@:2}" +} + +run_update_algorithm() { + # Run the underlying update algorithm + export SKELETON_COMMAND + SKELETON_COMMAND="${1:-"upgrade"}" + if test "$SKELETON_COMMAND" = "upgrade-patch" + then + do_update "${2:-"HEAD"}" + elif test "$SKELETON_COMMAND" = "upgrade" + then + do_update "${2:-"HEAD"}" --defaults + elif test "$SKELETON_COMMAND" = "patch" + then + # shellcheck disable=SC2068 + do_update "$LAST_REF" ${@:3} + else + error 1 "Unknown update algorithm: '$1'" + fi + determine_new_ref + determine_project_path +} + +after_update_algorithm() { + # Run post-update hooks, auto-commit changes + declare -a CONFLICTED_FILES + declare -a UNMERGED_FILES + local REVISION_PARAGRAPH + cd "$PROJECT_PATH" + info "${GREY}Previous skeleton revision:$NC $LAST_REF" + info "${GREY}Current skeleton revision:$NC ${NEW_REF:-"N/A"}" + REVISION_PARAGRAPH="Skeleton revision: $SKELETON_URL/tree/${NEW_REF:-"HEAD"}" + echo + note "Checking for conflicts..." + echo + readarray -t UNMERGED_FILES <<< "$(git diff --name-only --diff-filter=U)" + for UNMERGED_FILE in "${UNMERGED_FILES[@]}" + do + if ! test "$UNMERGED_FILE"; then continue; fi + if test "$(git diff --check "$UNMERGED_FILE")" + then + CONFLICTED_FILES+=("$UNMERGED_FILE") + else + git add "$UNMERGED_FILE" + fi + done + # shellcheck disable=SC2128 + while test "${CONFLICTED_FILES:-""}" + do + error 0 "There are conflicts in the following files:" + for CONFLICTED_FILE in "${CONFLICTED_FILES[@]}" + do + error 0 "- $CONFLICTED_FILE" + done + error 0 "Resolve them and press Enter." + read -r + readarray -t CONFLICTED_FILES <<< "$(git diff --name-only --diff-filter=U)" + echo + done + success "No conflicts, proceeding." + note "Locking Poetry dependencies..." + poetry lock || : + echo + if test "$(git status --porcelain)" + then + silent git add -A + silent git rm -f ./setup-local.bash + if test "$LAST_REF" = "$NEW_REF" + then + info "The version of the skeleton has not changed." + local COMMIT_MSG="Mechanized patch at $SKELETON@$NEW_REF" + else + if test "$NEW_REF" + then + local COMMIT_MSG="Upgrade to $SKELETON@$NEW_REF" + else + local COMMIT_MSG="Upgrade to $SKELETON of unknown revision" + fi + fi + silent redis-cli del "$PROJECT_PATH_KEY" + silent redis-cli del "$NEW_REF_KEY" + note "Committing changes..." + silent git commit --no-verify -m "$COMMIT_MSG" -m "$REVISION_PARAGRAPH" + else + info "No changes to commit." + fi + setup_gh && echo +} + +update_entrypoint() { + cd "${PROJECT_PATH:=$(git rev-parse --show-toplevel)}" || exit 1 + echo + info "${GREY}Last skeleton revision:$NC $LAST_REF" + echo + note "UPGRADE ROUTINE [1/3]: Running pre-update hooks." + before_update_algorithm + success "UPGRADE ROUTINE [1/3] COMPLETE." + echo + note "UPGRADE ROUTINE [2/3]: Running the underlying update algorithm." + run_update_algorithm "$@" + success "UPGRADE ROUTINE [2/3] COMPLETE." + echo + info "${GREY}Project path:$NC $PROJECT_PATH" + echo + note "UPGRADE ROUTINE [3/3]: Running post-update hooks." + after_update_algorithm + success "UPGRADE ROUTINE [3/3] COMPLETE." + echo + success "Done! 🎉" + echo + info "Your repository is now up to date with this $SKELETON revision:" + echo -e " ${BOLD}$SKELETON_URL/tree/${NEW_REF:-"HEAD"}$NC" +} + + +if test "${1:-}" = "--run" +then + setup_task_event + handle_task_event +fi \ No newline at end of file