diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
index fccacae..0761553 100644
--- a/.github/dependabot.yaml
+++ b/.github/dependabot.yaml
@@ -15,3 +15,13 @@ updates:
- "*"
cooldown:
default-days: 7
+ - package-ecosystem: "pre-commit"
+ directory: "/"
+ labels:
+ - dependencies
+ - skip news
+ schedule:
+ interval: "weekly"
+ day: "tuesday"
+ cooldown:
+ default-days: 7
diff --git a/.github/workflows/check.yaml b/.github/workflows/check.yaml
index 41382e4..bc31ea9 100644
--- a/.github/workflows/check.yaml
+++ b/.github/workflows/check.yaml
@@ -1,11 +1,11 @@
-name: check
+name: ๐งช check
on:
workflow_dispatch:
push:
branches: ["main"]
tags-ignore: ["**"]
pull_request:
- types: [opened, synchronize, reopened, labeled, unlabeled]
+ types: [opened, synchronize, reopened]
schedule:
- cron: "0 8 * * *"
concurrency:
@@ -15,6 +15,7 @@ permissions:
contents: read
jobs:
test:
+ name: ๐งช Test
runs-on: ubuntu-26.04
strategy:
fail-fast: false
@@ -31,54 +32,42 @@ jobs:
- dev
- pkg_meta
steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - name: ๐ฅ Check out code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- - name: Install the latest version of uv
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with:
+ version: latest-known
python-version: "3.15"
enable-cache: false
cache-dependency-glob: "pyproject.toml"
github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Install tox
+ - name: ๐ฆ Install tox
run: uv tool install --python-preference only-managed --python 3.15 tox --with tox-uv
- - name: Install Python
+ - name: ๐ Install Python
if: startsWith(matrix.env, '3.') && matrix.env != '3.15'
- run: uv python install --python-preference only-managed ${{ matrix.env }}
- - name: Setup test suite
- run: tox run -vv --notest --skip-missing-interpreters false -e ${{ matrix.env }}
- - name: Run test suite
- run: tox run --skip-pkg-install -e ${{ matrix.env }}
env:
+ MATRIX_ENV: ${{ matrix.env }}
+ run: uv python install --python-preference only-managed "$MATRIX_ENV"
+ - name: ๐ฆ Set up test suite
+ env:
+ MATRIX_ENV: ${{ matrix.env }}
+ run: tox run -vv --notest --skip-missing-interpreters false -e "$MATRIX_ENV"
+ - name: ๐งช Run test suite
+ run: tox run --skip-pkg-install -e "$MATRIX_ENV"
+ env:
+ MATRIX_ENV: ${{ matrix.env }}
PYTEST_ADDOPTS: "-vv --durations=20"
- changelog:
- if: github.event_name == 'pull_request' && !contains(github.event.pull_request.labels.*.name, 'skip news')
- runs-on: ubuntu-24.04
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- fetch-depth: 0
- persist-credentials: false
- - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
- with:
- python-version: "3.15"
- enable-cache: false
- - run: uvx towncrier check --compare-with "origin/${GITHUB_BASE_REF}"
gate:
- name: Required checks pass
- if: always()
- needs: [test, changelog]
+ name: ๐ฆ Required checks pass
+ if: ${{ !cancelled() }} # codespell:ignore cancelled
+ needs: [test]
runs-on: ubuntu-24.04
steps:
- - env:
+ - name: ๐ฆ Require all needed jobs to pass
+ env:
NEEDS_JSON: ${{ toJSON(needs) }}
- run: |
- jq -e '
- all(
- to_entries[];
- .value.result == "success" or
- (.key == "changelog" and .value.result == "skipped")
- )
- ' <<< "$NEEDS_JSON"
+ run: jq -e 'all(to_entries[]; .value.result == "success")' <<<"$NEEDS_JSON"
diff --git a/.github/workflows/codeql.yaml b/.github/workflows/codeql.yaml
new file mode 100644
index 0000000..29f8c82
--- /dev/null
+++ b/.github/workflows/codeql.yaml
@@ -0,0 +1,42 @@
+name: ๐ก๏ธ CodeQL
+on:
+ workflow_dispatch:
+ push:
+ branches: ["main"]
+ pull_request:
+ schedule:
+ - cron: "0 9 * * 2"
+concurrency:
+ group: codeql-${{ github.ref }}
+ cancel-in-progress: true
+permissions: {}
+jobs:
+ analyze:
+ name: ๐ก๏ธ Analyze ${{ matrix.language }}
+ runs-on: ubuntu-26.04
+ permissions:
+ contents: read
+ security-events: write
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [actions, python]
+ steps:
+ - name: ๐ฅ Check out code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+ - name: ๐ก๏ธ Initialize CodeQL
+ uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
+ with:
+ languages: ${{ matrix.language }}
+ build-mode: none
+ queries: security-extended
+ config: |
+ paths-ignore:
+ - roots
+ - tests
+ - name: ๐ก๏ธ Analyze
+ uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
+ with:
+ category: "/language:${{ matrix.language }}"
diff --git a/.github/workflows/news.yaml b/.github/workflows/news.yaml
new file mode 100644
index 0000000..c128cf3
--- /dev/null
+++ b/.github/workflows/news.yaml
@@ -0,0 +1,32 @@
+name: ๐ Changelog
+on:
+ pull_request:
+ types: [opened, reopened, synchronize, labeled, unlabeled]
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
+ cancel-in-progress: true
+permissions:
+ contents: read
+jobs:
+ changelog:
+ name: ๐ News fragment
+ runs-on: ubuntu-24.04
+ steps:
+ - name: ๐ฅ Check out code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ fetch-depth: 0
+ persist-credentials: false
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
+ with:
+ version: latest-known
+ python-version: "3.15"
+ enable-cache: false
+ - name: ๐ฆ Install locked release tools
+ uses: tox-dev/github-workflows/install-locked-tools@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ with:
+ groups: release-news
+ venv: ${{ runner.temp }}/release-tools
+ - name: ๐ Validate news fragments
+ uses: tox-dev/github-workflows/validate-news@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
diff --git a/.github/workflows/prepare-release.yaml b/.github/workflows/prepare-release.yaml
index 144d291..fe09a74 100644
--- a/.github/workflows/prepare-release.yaml
+++ b/.github/workflows/prepare-release.yaml
@@ -1,106 +1,27 @@
-name: Prepare release
+name: ๐ท๏ธ Prepare release
on:
workflow_dispatch:
inputs:
- version:
- description: Version to release, without a v prefix
+ bump:
+ description: Version bump strategy
required: true
+ type: choice
+ options:
+ - auto
+ - major
+ - minor
+ - patch
+ default: auto
permissions: {}
-concurrency:
- group: prepare-release
- cancel-in-progress: false
jobs:
- assemble:
- if: github.ref == 'refs/heads/main'
- runs-on: ubuntu-26.04
+ prepare:
+ name: ๐ท๏ธ Prepare Towncrier release
+ uses: tox-dev/github-workflows/.github/workflows/prepare-towncrier-release.yaml@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
permissions:
contents: read
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- fetch-depth: 0
- persist-credentials: false
- - uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
- with:
- python-version: "3.15"
- enable-cache: false
- - name: Build release patch
- env:
- VERSION: ${{ inputs.version }}
- run: |
- set -euo pipefail
- if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- echo "::error::expected a major.minor.patch version"
- exit 1
- fi
- latest=$(git tag --list '[0-9]*' | sort -V | tail -n 1)
- if [[ "$(printf '%s\n' "$latest" "$VERSION" | sort -V | tail -n 1)" != "$VERSION" || "$latest" == "$VERSION" ]]; then
- echo "::error::$VERSION must be newer than $latest"
- exit 1
- fi
- if ! compgen -G 'changelog.d/*.md' > /dev/null; then
- echo "::error::no changelog fragments to release"
- exit 1
- fi
- uvx towncrier build --yes --version "$VERSION"
- git diff HEAD --binary > "$RUNNER_TEMP/release.patch"
- test -s "$RUNNER_TEMP/release.patch"
- - uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
- with:
- name: release-patch
- path: ${{ runner.temp }}/release.patch
- if-no-files-found: error
- push:
- needs: assemble
- runs-on: ubuntu-26.04
- environment: release-auth
- permissions:
- contents: read
- steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- fetch-depth: 0
- persist-credentials: false
- - uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
- with:
- name: release-patch
- path: ${{ runner.temp }}/release-patch
- - name: Validate release patch
- env:
- VERSION: ${{ inputs.version }}
- run: |
- set -euo pipefail
- git fetch origin main
- git reset --hard origin/main
- git apply --check "$RUNNER_TEMP/release-patch/release.patch"
- git apply --index "$RUNNER_TEMP/release-patch/release.patch"
- while IFS= read -r path; do
- case "$path" in
- CHANGELOG.md|changelog.d/*.md) ;;
- *) echo "::error::unexpected release path: $path"; exit 1 ;;
- esac
- done < <(git diff --cached --name-only)
- grep -Fq "## $VERSION (" CHANGELOG.md
- git diff --cached --check
- - id: token
- uses: actions/create-github-app-token@64ab729a6294000f5aa4a4bc0b73d1f32bc45510 # v3.3.0
- with:
- client-id: ${{ vars.RELEASE_APP_CLIENT_ID }}
- private-key: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
- owner: ${{ github.repository_owner }}
- repositories: ${{ github.event.repository.name }}
- permission-contents: write
- - name: Commit and tag the release
- env:
- VERSION: ${{ inputs.version }}
- GH_TOKEN: ${{ steps.token.outputs.token }}
- APP_SLUG: ${{ steps.token.outputs.app-slug }}
- run: |
- set -euo pipefail
- app_user_id=$(gh api "/users/${APP_SLUG}[bot]" --jq .id)
- git config user.name "${APP_SLUG}[bot]"
- git config user.email "${app_user_id}+${APP_SLUG}[bot]@users.noreply.github.com"
- git commit -m "chore: prepare $VERSION"
- git tag "$VERSION"
- gh auth setup-git --hostname github.com --force
- git push --atomic origin HEAD:main "refs/tags/$VERSION"
+ pull-requests: read
+ with:
+ bump: ${{ inputs.bump }}
+ release-auth-deployment: false
+ secrets:
+ RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
index 58b098a..fabd0f7 100644
--- a/.github/workflows/release.yaml
+++ b/.github/workflows/release.yaml
@@ -1,48 +1,64 @@
-name: Release to PyPI
+name: ๐ Release to PyPI
on:
push:
tags: ["*"]
permissions:
contents: read
-env:
- dists-artifact-name: python-package-distributions
+concurrency:
+ group: release-${{ github.ref }}
+ cancel-in-progress: false
jobs:
build:
+ name: ๐๏ธ Build
+ uses: tox-dev/github-workflows/.github/workflows/validate-python-release.yaml@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ permissions:
+ contents: read
+ notes:
+ name: ๐ Render GitHub Release notes
runs-on: ubuntu-26.04
+ permissions:
+ contents: read
+ outputs:
+ artifact-id: ${{ steps.upload.outputs.artifact-id }}
steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - name: ๐ฅ Check out code
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
fetch-depth: 0
persist-credentials: false
- - name: Require a changelog section for the tag
- env:
- TAG: ${{ github.ref_name }}
- run: |
- if [[ ! "$TAG" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
- echo "::error::unexpected release tag $TAG"
- exit 1
- fi
- if ! grep -qF "## $TAG (" CHANGELOG.md; then
- echo "::error::CHANGELOG.md has no section for $TAG"
- exit 1
- fi
- - name: Install the latest version of uv
- uses: astral-sh/setup-uv@1c37ad07a6a961277cf70c0d37d6f313000f5884 # v10.3.0
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with:
+ version: latest-known
python-version: "3.15"
enable-cache: false
- cache-dependency-glob: "pyproject.toml"
- github-token: ${{ secrets.GITHUB_TOKEN }}
- - name: Build package
- run: uv build --python 3.15 --python-preference only-managed --sdist --wheel . --out-dir dist
- - name: Store the distribution packages
+ - name: ๐ฆ Install locked release tools
+ uses: tox-dev/github-workflows/install-locked-tools@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ with:
+ groups: release-notes
+ venv: ${{ runner.temp }}/release-tools
+ - name: ๐ท๏ธ Select previous tag
+ id: previous
+ uses: tox-dev/github-workflows/select-previous-tag@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ with:
+ tag: ${{ github.ref_name }}
+ - name: ๐ Render release notes
+ uses: tox-dev/github-workflows/render-release-notes@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ with:
+ tag: ${{ github.ref_name }}
+ previous: ${{ steps.previous.outputs.previous }}
+ changelog: CHANGELOG.md
+ artifact-url: https://pypi.org/project/sphinx-argparse-cli/${{ github.ref_name }}/
+ - name: ๐ค Upload release notes
+ id: upload
uses: actions/upload-artifact@cf430e030ddbb5b0abf93d22962f4752f3646cd9 # v7.0.2
with:
- name: ${{ env.dists-artifact-name }}
- path: dist/*
- release:
- needs:
- - build
+ name: github-release-notes
+ path: ${{ runner.temp }}/release-notes.md
+ if-no-files-found: error
+ publish:
+ name: ๐ Publish to PyPI
+ needs: [build, notes]
runs-on: ubuntu-26.04
environment:
name: release
@@ -50,38 +66,52 @@ jobs:
permissions:
id-token: write
steps:
- - name: Download all the dists
+ - name: ๐ฉ Download distributions
uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
with:
- name: ${{ env.dists-artifact-name }}
+ artifact-ids: ${{ needs.build.outputs.distributions-artifact-id }}
path: dist/
- - name: Publish to PyPI
+ - name: ๐ Publish to PyPI
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
with:
attestations: true
- github-release:
- needs: release
+ packages-dir: dist
+ release:
+ name: ๐ Publish GitHub Release
+ needs: [build, publish, notes]
runs-on: ubuntu-26.04
permissions:
contents: write
steps:
- - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ - name: ๐ Install uv
+ uses: astral-sh/setup-uv@07a047e608db84b3d8c06cd9a7c7dcc9c355c18e # v10.3.2
with:
- fetch-depth: 0
- persist-credentials: false
- - name: Publish GitHub Release
+ version: latest-known
+ python-version: "3.15"
+ enable-cache: false
+ ignore-empty-workdir: true
+ - name: ๐ฉ Download distributions
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
+ with:
+ artifact-ids: ${{ needs.build.outputs.distributions-artifact-id }}
+ path: dist/
+ - name: ๐ฉ Download release notes
+ uses: actions/download-artifact@9000827ccba6bdab643e8b6fd33ac0654aef8333 # v8.0.2
+ with:
+ artifact-ids: ${{ needs.notes.outputs.artifact-id }}
+ path: ${{ runner.temp }}
+ - name: ๐ Verify PyPI artifacts
+ uses: tox-dev/github-workflows/reconcile-pypi-artifacts@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ with:
+ project: sphinx-argparse-cli
+ version: ${{ github.ref_name }}
+ dist: dist
+ - name: ๐ Publish GitHub Release
+ uses: tox-dev/github-workflows/publish-github-release@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
env:
GH_TOKEN: ${{ github.token }}
- TAG: ${{ github.ref_name }}
- run: |
- set -euo pipefail
- awk -v tag="$TAG" 'index($0, "## " tag " (") == 1 { found = 1; next } found && /^## / { exit } found { print }' CHANGELOG.md > "$RUNNER_TEMP/release-notes.md"
- test -s "$RUNNER_TEMP/release-notes.md"
- printf '\n[PyPI release](https://pypi.org/project/sphinx-argparse-cli/%s/)\n' "$TAG" >> "$RUNNER_TEMP/release-notes.md"
- previous=$(git tag --list '[0-9]*' | grep -E '^[0-9]+\.[0-9]+\.[0-9]+$' | sort -V | awk -v tag="$TAG" '$0 == tag { print previous; exit } { previous = $0 }')
- if [[ -n "$previous" ]]; then
- printf '\n**Full Changelog**: https://github.com/%s/compare/%s...%s\n' "$GITHUB_REPOSITORY" "$previous" "$TAG" >> "$RUNNER_TEMP/release-notes.md"
- else
- printf '\n**Full Changelog**: https://github.com/%s/commits/%s\n' "$GITHUB_REPOSITORY" "$TAG" >> "$RUNNER_TEMP/release-notes.md"
- fi
- gh release create "$TAG" --verify-tag --title "$TAG" --notes-file "$RUNNER_TEMP/release-notes.md"
+ with:
+ tag: ${{ github.ref_name }}
+ commit: ${{ github.sha }}
+ title: ${{ github.ref_name }}
+ notes-file: ${{ runner.temp }}/release-notes.md
diff --git a/.github/workflows/upgrade-release-tools.yaml b/.github/workflows/upgrade-release-tools.yaml
new file mode 100644
index 0000000..8e37752
--- /dev/null
+++ b/.github/workflows/upgrade-release-tools.yaml
@@ -0,0 +1,17 @@
+name: ๐ Upgrade release tools
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: "0 8 * * 2"
+permissions: {}
+concurrency:
+ group: upgrade-release-tools
+ cancel-in-progress: false
+jobs:
+ upgrade:
+ name: ๐ Upgrade release tools
+ uses: tox-dev/github-workflows/.github/workflows/upgrade-release-tools.yaml@259a3d3fb578d00517ffb73341fdd463259b0b2f # 6.0.1
+ permissions:
+ contents: read
+ secrets:
+ RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
diff --git a/.gitignore b/.gitignore
index 7144381..4a44475 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,3 +9,4 @@ __pycache__
build
dist
src/sphinx_argparse_cli/version.py
+/uv.lock
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e91bdb0..15d85bc 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,50 +1,50 @@
+ci:
+ autoupdate_schedule: quarterly
default_language_version:
python: python3.15
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v6.0.0
+ rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # frozen: v6.0.0
hooks:
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/python-jsonschema/check-jsonschema
- rev: 0.38.2
+ rev: 0494aa7fa1314e98913a41227d8f0a515b2c1049 # frozen: 0.38.2
hooks:
- id: check-github-workflows
args: ["--verbose"]
- repo: https://github.com/codespell-project/codespell
- rev: v2.4.3
+ rev: 57b21406f092110c18776e39b0bda50d37c945c8 # frozen: v2.4.3
hooks:
- id: codespell
- repo: https://github.com/tox-dev/tox-toml-fmt
- rev: "v1.11.1"
+ rev: "5125f601c3e134347288c3d42f3b34298b7cf1be" # frozen: v1.11.1
hooks:
- id: tox-toml-fmt
- repo: https://github.com/tox-dev/pyproject-fmt
- rev: "v2.30.3"
+ rev: "50e0f3aee9dc5747a5f173f79a7417403c18dda6" # frozen: v2.30.3
hooks:
- id: pyproject-fmt
- repo: https://github.com/astral-sh/ruff-pre-commit
- rev: "v0.17.1"
+ rev: "38bfb07c0c64c304f47eb52090f8288150c77730" # frozen: v0.17.1
hooks:
- id: ruff-format
- id: ruff
args: ["--fix", "--unsafe-fixes", "--exit-non-zero-on-fix"]
- repo: https://github.com/google/yamlfmt
- rev: "v0.21.0"
+ rev: "21ca5323a9c87ee37a434e0ca908efc0a89daa07" # frozen: v0.21.0
hooks:
- id: yamlfmt
- - repo: local
+ - repo: https://github.com/hukkin/mdformat
+ rev: 82912cdaea4fb830f751504486a7879c70526547 # frozen: 1.0.0
hooks:
- id: mdformat
- name: mdformat
- entry: mdformat --wrap 120
- language: python
- types: [markdown]
+ args: ["--wrap", "120"]
additional_dependencies:
- - mdformat-gfm>=1
- - mdformat-ruff>=0.1.3
+ - mdformat-gfm==1.0.0
+ - mdformat-ruff==0.1.3
- repo: https://github.com/zizmorcore/zizmor-pre-commit
- rev: v1.31.1
+ rev: c92afdf2c6ca336aaa8f39e2bd8d48f62dbd8e1f # frozen: v1.31.1
hooks:
- id: zizmor
- repo: meta
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 75e8155..4778969 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,188 +4,518 @@ All notable changes to this project will be documented in this file.
+
+
## 1.24.0 (2026-10-10)
-- Require Python 3.11 and use Python 3.15 by default.
+
+
+### Added
+
+- Require Python 3.11 and use Python 3.15 by default ([#369](https://github.com/tox-dev/sphinx-argparse-cli/pull/369))
+ by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.23.0 (2026-08-27)
-- Register flags and positional arguments as Sphinx program options so the `:option:` role links to them.
-- Keep apostrophes in help text and make `:hook:` intercept `parse_intermixed_args()`.
-- Strip ANSI colors from usage blocks and skip subcommands whose help is suppressed.
-- Render untitled argument groups, multi-paragraph help, positional arguments, and subcommand epilogs correctly.
-- Preserve raw formatter line breaks, render metavars and choices as in usage, and expand argparse format specifiers.
-- Expand `{subcommand}` in `:group_sub_title_prefix:` to the subcommand name chain.
+
+
+### Added
+
+- Register CLI arguments as Sphinx program options so `:option:` can link to them
+ ([#346](https://github.com/tox-dev/sphinx-argparse-cli/pull/346)) by [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Fixed
+
+- Render positional arguments declared before `add_subparsers()`
+ ([#347](https://github.com/tox-dev/sphinx-argparse-cli/pull/347)) by [@gaborbernat](https://github.com/gaborbernat).
+- Keep apostrophes in help text ([#349](https://github.com/tox-dev/sphinx-argparse-cli/pull/349)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Render argument groups without a title ([#350](https://github.com/tox-dev/sphinx-argparse-cli/pull/350)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Make `:hook:` intercept `parse_intermixed_args()` ([#351](https://github.com/tox-dev/sphinx-argparse-cli/pull/351)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Preserve raw formatter line breaks and render subcommand epilogs
+ ([#352](https://github.com/tox-dev/sphinx-argparse-cli/pull/352)) by [@gaborbernat](https://github.com/gaborbernat).
+- Render option metavars, argument counts, and choices as in usage
+ ([#353](https://github.com/tox-dev/sphinx-argparse-cli/pull/353)) by [@gaborbernat](https://github.com/gaborbernat).
+- Render list and multi-paragraph help under the option
+ ([#354](https://github.com/tox-dev/sphinx-argparse-cli/pull/354)) by [@gaborbernat](https://github.com/gaborbernat).
+- Expand argparse format specifiers in help text ([#355](https://github.com/tox-dev/sphinx-argparse-cli/pull/355)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Strip ANSI colors from usage blocks ([#356](https://github.com/tox-dev/sphinx-argparse-cli/pull/356)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Skip subcommands whose help is suppressed ([#357](https://github.com/tox-dev/sphinx-argparse-cli/pull/357)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Expand `{subcommand}` to the subcommand name chain ([#358](https://github.com/tox-dev/sphinx-argparse-cli/pull/358))
+ by [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Documentation
+
+- Name `force_refs_lower` correctly in the changelog ([#348](https://github.com/tox-dev/sphinx-argparse-cli/pull/348))
+ by [@gaborbernat](https://github.com/gaborbernat).
+- Explain that help text uses reStructuredText ([#359](https://github.com/tox-dev/sphinx-argparse-cli/pull/359)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.22.1 (2026-08-11)
-- Fix type checks for nested subparsers.
+
## 1.22.0 (2026-07-20)
-- Add Python 3.15 to the test matrix and update documentation tooling.
+
+
+### Added
+
+- Add Python 3.15 support ([#331](https://github.com/tox-dev/sphinx-argparse-cli/pull/331)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.21.4 (2026-07-06)
-- Keep Sphinx smart quotes from rewriting `--option` names in descriptions, epilogs, and help text.
+
+
+### Fixed
+
+- Keep Sphinx smart quotes from rewriting `--option` names in descriptions, epilogs, and help text
+ ([#322](https://github.com/tox-dev/sphinx-argparse-cli/pull/322)) by [@mmulqueen](https://github.com/mmulqueen).
+
+
## 1.21.3 (2026-03-19)
-- Handle formatter subclasses and wrap preformatted blocks.
+
+
+### Fixed
+
+- Handle formatter subclasses and wrap preformatted blocks
+ ([#297](https://github.com/tox-dev/sphinx-argparse-cli/pull/297)) by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.21.2 (2026-03-16)
-- Avoid a crash when a toctree title is empty.
+
+
+### Fixed
+
+- Avoid a crash when a toctree title is empty ([#296](https://github.com/tox-dev/sphinx-argparse-cli/pull/296)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.21.1 (2026-03-02)
-- Restructure the README around common use cases.
+
+
+### Documentation
+
+- Restructure the README around common use cases ([#292](https://github.com/tox-dev/sphinx-argparse-cli/pull/292)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.21.0 (2026-03-02)
-- Fix rendering of tuple metavars, subcommand names, group titles, and empty toctree titles.
-- Migrate development tooling to `tox.toml`, dependency groups, and ty.
+
+
+### Fixed
+
+- Render all tuple metavar elements and suppress `None` defaults
+ ([#287](https://github.com/tox-dev/sphinx-argparse-cli/pull/287)) by [@gaborbernat](https://github.com/gaborbernat).
+- Propagate a `:prog:` override to subcommands ([#288](https://github.com/tox-dev/sphinx-argparse-cli/pull/288)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Handle multi-word program names in group titles ([#289](https://github.com/tox-dev/sphinx-argparse-cli/pull/289)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Remove a missing custom CSS reference ([#290](https://github.com/tox-dev/sphinx-argparse-cli/pull/290)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Use a section node when a toctree title is empty ([#291](https://github.com/tox-dev/sphinx-argparse-cli/pull/291)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.20.1 (2025-10-08)
-- Disable color codes while parsing a CLI.
+
+
+### Fixed
+
+- Disable color codes while parsing a CLI ([#252](https://github.com/tox-dev/sphinx-argparse-cli/pull/252)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.20.0 (2025-10-08)
-- Add Python 3.14 support and end support for Python 3.10.
+
+
+### Added
+
+- Add Python 3.14 support and end support for Python 3.10
+ ([#251](https://github.com/tox-dev/sphinx-argparse-cli/pull/251)) by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.19.0 (2024-12-10)
-- Handle nested subparsers.
+
+
+### Added
+
+- Handle nested subparsers ([#207](https://github.com/tox-dev/sphinx-argparse-cli/pull/207)) by
+ [@ianw](https://github.com/ianw).
+
+
## 1.18.2 (2024-09-18)
-- Improve CI.
+
## 1.18.1 (2024-09-08)
-- Fix the README.
+
+
+### Documentation
+
+- Fix the README by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.18.0 (2024-09-08)
-- Add Python 3.13 support and end support for Python 3.9.
+
+
+### Added
+
+- Add Python 3.13 support and end support for Python 3.9
+ ([#184](https://github.com/tox-dev/sphinx-argparse-cli/pull/184)) by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.17.0 (2024-08-06)
-- Add `force_refs_lower` for `:ref:` links with mixed-case program names and arguments.
+
+
+### Added
+
+- Add `force_refs_lower` for `:ref:` links with mixed-case program names and arguments
+ ([#179](https://github.com/tox-dev/sphinx-argparse-cli/pull/179)) by [@ianw](https://github.com/ianw).
+
+
## 1.16.0 (2024-06-18)
-- Declare the extension safe for parallel reads by Sphinx.
+
+
+### Added
+
+- Declare the extension safe for parallel reads by Sphinx
+ ([#171](https://github.com/tox-dev/sphinx-argparse-cli/pull/171)) by [@JSCU-CNI](https://github.com/JSCU-CNI).
+
+
## 1.15.0 (2024-04-17)
-- Support Sphinx 7.3 and end support for Python 3.8.
+
+
+### Added
+
+- Support Sphinx 7.3 and end support for Python 3.8 ([#163](https://github.com/tox-dev/sphinx-argparse-cli/pull/163)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.14.0 (2024-03-22)
-- Allow content inside the directive.
+
+
+### Added
+
+- Allow content inside the directive ([#158](https://github.com/tox-dev/sphinx-argparse-cli/pull/158)) by
+ [@mondeja](https://github.com/mondeja).
+
+
## 1.13.1
-- Fix multiline handling of group descriptions.
+
+
+### Fixed
+
+- Fix multiline handling of group descriptions ([#152](https://github.com/tox-dev/sphinx-argparse-cli/pull/152)) by
+ [@mayrholu](https://github.com/mayrholu).
+
+
## 1.13.0
-- Don't render arguments with `help=argparse.SUPPRESS`.
-- Show epilogue if present in the command description.
-- Add option to show usage before description.
+
+
+### Added
+
+- Add option to show usage before description ([#148](https://github.com/tox-dev/sphinx-argparse-cli/pull/148)) by
+ [@mayrholu](https://github.com/mayrholu).
+
+
+
+### Fixed
+
+- Don't render arguments with `help=argparse.SUPPRESS` ([#149](https://github.com/tox-dev/sphinx-argparse-cli/pull/149))
+ by [@mayrholu](https://github.com/mayrholu).
+- Show epilogue if present in the command description ([#146](https://github.com/tox-dev/sphinx-argparse-cli/pull/146))
+ by [@mayrholu](https://github.com/mayrholu).
+
+
## 1.12.0
-- Support rendering with `argparse.RawDescriptionHelpFormatter`.
+
+
+### Added
+
+- Support rendering with `argparse.RawDescriptionHelpFormatter`
+ ([#144](https://github.com/tox-dev/sphinx-argparse-cli/pull/144)) by [@mayrholu](https://github.com/mayrholu).
+
+
## 1.11.1
-- Fix broken end-user references ([#95](https://github.com/tox-dev/sphinx-argparse-cli/pull/95)).
-- Declare Python 3.12 support ([#102](https://github.com/tox-dev/sphinx-argparse-cli/pull/102)).
+
+
+### Added
+
+- Declare Python 3.12 support ([#102](https://github.com/tox-dev/sphinx-argparse-cli/pull/102)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Fixed
+
+- Fix broken end-user references ([#95](https://github.com/tox-dev/sphinx-argparse-cli/pull/95)) by
+ [@webknjaz](https://github.com/webknjaz).
+
+
## 1.11.0
-- Hatchling as backend and exclude sphinx 6.1 support.
+
+
+### Added
+
+- End support for Sphinx 6.1 by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.10.0
-- Add the option to override the generated `default` part of the CLI parameter description.
+
+
+### Added
+
+- Add the option to override the generated `default` part of the CLI parameter description
+ ([#56](https://github.com/tox-dev/sphinx-argparse-cli/pull/56)) by [@berhoel](https://github.com/berhoel).
+
+
## 1.9.0
+
+
+### Added
+
- Add the option to override the description using the `description` attribute of the directive
+ ([#45](https://github.com/tox-dev/sphinx-argparse-cli/pull/45)) by [@Schamper](https://github.com/Schamper).
- Add the option to retrieve the arguments by hooking argparse, in cases where `func` consumes the arguments and does
- not return them
+ not return them ([#46](https://github.com/tox-dev/sphinx-argparse-cli/pull/46)) by
+ [@Schamper](https://github.com/Schamper).
+
+
## 1.8.3
-- Fix project links after the move to tox-dev.
+
+
+### Fixed
+
+- Fix project links after the move to tox-dev by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.8.2
+
+
+### Fixed
+
- Don't raise label clashing warnings for options which only differ between upper and lower case
+ ([#34](https://github.com/tox-dev/sphinx-argparse-cli/pull/34)) by [@mondeja](https://github.com/mondeja).
+
+
## 1.8.1
+
+
+### Fixed
+
- Fix reference clashing for options which only differ between upper and lower case
+ ([#32](https://github.com/tox-dev/sphinx-argparse-cli/pull/32)) by [@mondeja](https://github.com/mondeja).
- Do not render default values for `store_true` and `store_false` actions
+ ([#30](https://github.com/tox-dev/sphinx-argparse-cli/pull/30)) by [@mondeja](https://github.com/mondeja).
+
+
## 1.8.0
-- Support Python 3.10
+
+
+### Added
+
+- Support Python 3.10 ([#13](https://github.com/tox-dev/sphinx-argparse-cli/pull/13)) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.7.0
+
+
+### Added
+
- Support for adding custom subsection group title prefix (`group_title_prefix` and `group_sub_title_prefix` directive
- arguments)
+ arguments) ([#12](https://github.com/tox-dev/sphinx-argparse-cli/pull/12)) by [@mondeja](https://github.com/mondeja).
+
+
## 1.6.0 (2021-04-15)
-- Support for using the `ref` sphinx role to refer to all anchor-able objects generated by the tool
-- Flags now have their reference title set (for the HTML builder this is shown when hover over the reference)
-- Anchors generated no longer collapse multiple subsequent `-` characters (to avoid clash when there's a flag and a
- positional argument with the same name)
+
+
+### Added
+
+- Support for using the `ref` sphinx role to refer to all anchor-able objects generated by the tool by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Flags now have their reference title set (for the HTML builder this is shown when hover over the reference) by
+ [@gaborbernat](https://github.com/gaborbernat).
- Added a sphinx flag `sphinx_argparse_cli_prefix_document` (by default `False`) to avoid reference clashes when
- multiple documents generate the same reference labels
+ multiple documents generate the same reference labels by [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Fixed
+
+- Anchors generated no longer collapse multiple subsequent `-` characters (to avoid clash when there's a flag and a
+ positional argument with the same name) by [@gaborbernat](https://github.com/gaborbernat).
- The root `prog` name now is prefixed for the root level optional/positional arguments' header (to avoid multiple
- anchors with the same id when multiple commands are documented in the same document)
+ anchors with the same id when multiple commands are documented in the same document) by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.5.2
-- Prefer a parser's description over its help message for subcommands.
+
+
+### Changes
+
+- Prefer a parser's description over its help message for subcommands by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.5.1 (2021-04-15)
-- Update the README and development dependencies.
+
+
+### Documentation
+
+- Update the README by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.5.0 (2021-02-13)
+
+
+### Changes
+
- Display the metavar (fallback to dest) if the action has more than one argument (this is inline with how usage is
- displayed).
+ displayed) by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.4.0 (2021-02-13)
-- Command line arguments are now bold to highlight them even further from the help text
+
+
+### Changes
+
+- Command line arguments are now bold to highlight them even further from the help text by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.3.0 (2021-02-13)
-- Add support for changing the usage width via the `usage_width` option on the directive
-- Mark document as always needs update (as the underlying content is coming from outside the sphinx documents)
-- Help messages is now interpreted as reStructuredText
-- Matching curly braces, single and double quotes in help text will be marked as string literals
+
+
+### Added
+
+- Add support for changing the usage width via the `usage_width` option on the directive by
+ [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Changes
+
+- Help messages are now interpreted as reStructuredText by [@gaborbernat](https://github.com/gaborbernat).
+
+
+
+### Fixed
+
+- Mark document as always needs update (as the underlying content is coming from outside the sphinx documents) by
+ [@gaborbernat](https://github.com/gaborbernat).
+- Matching curly braces, single and double quotes in help text will be marked as string literals by
+ [@gaborbernat](https://github.com/gaborbernat).
- Help messages containing the `default(s)` word do not show the default value (as often this indicates the default is
- already documented in the help text)
+ already documented in the help text) by [@gaborbernat](https://github.com/gaborbernat).
+
+
## 1.2.0 (2021-02-05)
-- Add support for changing (removing) the title via the `title` attribute of the directive.
+
+
+### Added
+
+- Add support for changing (removing) the title via the `title` attribute of the directive
+ ([#3](https://github.com/tox-dev/sphinx-argparse-cli/pull/3)) by [@mondeja](https://github.com/mondeja).
+
+
## 1.1.0 (2021-02-05)
-- Add support for setting the `prog` of the parser via the a `prog` attribute of the directive.
+
+
+### Added
+
+- Add support for setting the parser's `prog` with the directive's `prog` attribute
+ ([#1](https://github.com/tox-dev/sphinx-argparse-cli/pull/1)) by [@mondeja](https://github.com/mondeja).
+
+
## 1.0.0 (2021-02-05)
-- First version.
+
+
+### Added
+
+- First version by [@gaborbernat](https://github.com/gaborbernat).
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..82182b3
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,28 @@
+# Contributing
+
+Run the tests and type checker with `tox -e 3.15,type`. Run `prek run --all-files` before pushing a pull request.
+
+## Release notes
+
+Add a `changelog.d/+short-name..md` fragment when a pull request changes what package users can use or observe.
+Use one fragment per user-facing change. The release workflow links each fragment to its merged squash pull request.
+
+| Type | Changelog section | Use for |
+| ------------- | ----------------- | ---------------------------------------------------------- |
+| `feature` | Added | New capabilities and Python support additions or removals |
+| `change` | Changes | Changed behavior that remains available |
+| `bugfix` | Fixed | Corrected behavior |
+| `doc` | Documentation | Documentation changes users need to know about |
+| `breaking` | Breaking changes | Changes that require users to update code or configuration |
+| `security` | Security | Security fixes users need to act on |
+| `performance` | Performance | User-visible speed or resource improvements |
+| `deprecation` | Deprecated | Supported behavior scheduled for removal |
+| `removal` | Removed | Removed user-facing capabilities other than Python support |
+| `packaging` | Packaging | Install, wheel, or distribution changes |
+
+Use `skip news` for a pull request with no user-facing change. The label can be applied after the pull request opens. A
+fragment still has to be valid when the label is present. Dependabot, pre-commit.ci, and repository automation receive
+the label when their pull request has no fragment.
+
+Do not write credits in fragments. The release credits come from the commit authors and `Co-authored-by` trailers, and
+the prepare workflow runs `release-creator contributors` to add first-time contributors to the changelog.
diff --git a/README.md b/README.md
index 282a3dc..0306e86 100644
--- a/README.md
+++ b/README.md
@@ -9,8 +9,8 @@
Render CLI arguments (sub-commands friendly) defined by the argparse module.
-See the [changelog](CHANGELOG.md) for released changes. Pull requests need a `changelog.d/..md` fragment; use
-the `skip news` label for changes that do not need release notes.
+See the [changelog](CHANGELOG.md) for released changes. The [contribution guide](CONTRIBUTING.md) explains which pull
+requests need a fragment, how to name it, and when to use `skip news`.
## Getting started
diff --git a/changelog.d/+pypi-readme-links.bugfix.md b/changelog.d/+pypi-readme-links.bugfix.md
new file mode 100644
index 0000000..d916c91
--- /dev/null
+++ b/changelog.d/+pypi-readme-links.bugfix.md
@@ -0,0 +1 @@
+Fix repository links in the PyPI project description.
diff --git a/pylock.toml b/pylock.toml
new file mode 100644
index 0000000..afa1102
--- /dev/null
+++ b/pylock.toml
@@ -0,0 +1,2503 @@
+lock-version = "1.0"
+environments = [
+ "python_version == \"3.15\" and sys_platform == \"linux\" and platform_machine == \"x86_64\" and implementation_name == \"cpython\" and platform_python_implementation == \"CPython\" and platform_system == \"Linux\"",
+]
+requires-python = ">=3.11"
+dependency-groups = [
+ "build",
+ "dev",
+ "lint",
+ "pkg-meta",
+ "project-runtime",
+ "release-news",
+ "release-notes",
+ "release-prepare",
+ "test",
+ "type",
+]
+default-groups = [
+ "project-runtime",
+]
+created-by = "nab"
+
+[[packages]]
+name = "alabaster"
+version = "1.0.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "alabaster-1.0.0.tar.gz"
+upload-time = 2024-07-26 18:15:03.762569+00:00
+url = "https://files.pythonhosted.org/packages/a6/f8/d9c74d0daf3f742840fd818d69cfae176fa332022fd44e3469487d5a9420/alabaster-1.0.0.tar.gz"
+size = 24210
+
+[packages.sdist.hashes]
+sha256 = "c00dca57bca26fa62a6d7d0a9fcce65f3e026e9bfe33e9c538fd3fbb2144fd9e"
+
+[[packages.wheels]]
+name = "alabaster-1.0.0-py3-none-any.whl"
+upload-time = 2024-07-26 18:15:02.050654+00:00
+url = "https://files.pythonhosted.org/packages/7e/b3/6b4067be973ae96ba0d615946e314c5ae35f9f993eca561b356540bb0c2b/alabaster-1.0.0-py3-none-any.whl"
+size = 13929
+
+[packages.wheels.hashes]
+sha256 = "fc6786402dc3fcb2de3cabd5fe455a2db534b371124f1f21de8731783dec828b"
+
+[[packages]]
+name = "annotated-types"
+version = "0.8.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "annotated_types-0.8.0.tar.gz"
+upload-time = 2026-07-23 20:16:13.995706+00:00
+url = "https://files.pythonhosted.org/packages/5f/56/a8120250d128bed162cd73c76d45f6ef9991f3e068f62a8ee060afa3104a/annotated_types-0.8.0.tar.gz"
+size = 15893
+
+[packages.sdist.hashes]
+sha256 = "13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7"
+
+[[packages.wheels]]
+name = "annotated_types-0.8.0-py3-none-any.whl"
+upload-time = 2026-07-23 20:16:12.938651+00:00
+url = "https://files.pythonhosted.org/packages/99/91/8acff4f5e50511b911bbccb72b8628a49c68ce14148cd9f6431094859a90/annotated_types-0.8.0-py3-none-any.whl"
+size = 13427
+
+[packages.wheels.hashes]
+sha256 = "f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0"
+
+[[packages]]
+name = "attrs"
+version = "26.1.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "attrs-26.1.0.tar.gz"
+upload-time = 2026-03-19 14:22:25.026315+00:00
+url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz"
+size = 952055
+
+[packages.sdist.hashes]
+sha256 = "d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32"
+
+[[packages.wheels]]
+name = "attrs-26.1.0-py3-none-any.whl"
+upload-time = 2026-03-19 14:22:23.645947+00:00
+url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl"
+size = 67548
+
+[packages.wheels.hashes]
+sha256 = "c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309"
+
+[[packages]]
+name = "babel"
+version = "2.18.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "babel-2.18.0.tar.gz"
+upload-time = 2026-02-01 12:30:56.078194+00:00
+url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz"
+size = 9959554
+
+[packages.sdist.hashes]
+sha256 = "b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d"
+
+[[packages.wheels]]
+name = "babel-2.18.0-py3-none-any.whl"
+upload-time = 2026-02-01 12:30:53.445172+00:00
+url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl"
+size = 10196845
+
+[packages.wheels.hashes]
+sha256 = "e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35"
+
+[[packages]]
+name = "certifi"
+version = "2026.10.18"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups"
+requires-python = ">=3.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "certifi-2026.10.18.tar.gz"
+upload-time = 2026-10-18 16:21:07.655710+00:00
+url = "https://files.pythonhosted.org/packages/7e/eb/a2aa1ac3ea30dd3f30ca57f40232138b6b0040719316ecb85daf61167771/certifi-2026.10.18.tar.gz"
+size = 135227
+
+[packages.sdist.hashes]
+sha256 = "b9995d97b64d0431a5af837d8ca8cd6238104d1f319f04bd93ea43124d6c861e"
+
+[[packages.wheels]]
+name = "certifi-2026.10.18-py3-none-any.whl"
+upload-time = 2026-10-18 16:21:06.276884+00:00
+url = "https://files.pythonhosted.org/packages/08/ba/95dd616042484f7c83a06974388b37b837732740ee70bc5dc715b5fcd55a/certifi-2026.10.18-py3-none-any.whl"
+size = 134093
+
+[packages.wheels.hashes]
+sha256 = "73191c47aaa79da394e8fee2dbc2ec827432cab56311122c9e47abf79e390f62"
+
+[[packages]]
+name = "cffi"
+version = "2.1.1"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "pycparser" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "cffi-2.1.1.tar.gz"
+upload-time = 2026-08-03 21:21:18.939988+00:00
+url = "https://files.pythonhosted.org/packages/9e/ef/008a1939e372c06329a3fce4279c02f328488f3526744906eeec3da7ad5f/cffi-2.1.1.tar.gz"
+size = 530807
+
+[packages.sdist.hashes]
+sha256 = "dd31f52ea1086513bb9df30f8fcee9b8918323ae067a3d5b78bc826a000712be"
+
+[[packages.wheels]]
+name = "cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+upload-time = 2026-08-03 21:20:57.336082+00:00
+url = "https://files.pythonhosted.org/packages/44/16/29e6d01b388bef055ecd6ca8244b3f4d336bd09e92d5d892187b9601084e/cffi-2.1.1-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+size = 221630
+
+[packages.wheels.hashes]
+sha256 = "aeae0e330c9f6acd681f647d46cefd30c29f93e3392882e792e82080c9691399"
+
+[[packages]]
+name = "cfgv"
+version = "3.5.0"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "cfgv-3.5.0.tar.gz"
+upload-time = 2025-11-19 20:55:51.612035+00:00
+url = "https://files.pythonhosted.org/packages/4e/b5/721b8799b04bf9afe054a3899c6cf4e880fcf8563cc71c15610242490a0c/cfgv-3.5.0.tar.gz"
+size = 7334
+
+[packages.sdist.hashes]
+sha256 = "d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"
+
+[[packages.wheels]]
+name = "cfgv-3.5.0-py2.py3-none-any.whl"
+upload-time = 2025-11-19 20:55:50.744331+00:00
+url = "https://files.pythonhosted.org/packages/db/3c/33bac158f8ab7f89b2e59426d5fe2e4f63f7ed25df84c036890172b412b5/cfgv-3.5.0-py2.py3-none-any.whl"
+size = 7445
+
+[packages.wheels.hashes]
+sha256 = "a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0"
+
+[[packages]]
+name = "charset-normalizer"
+version = "3.5.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups"
+requires-python = ">=3.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "charset_normalizer-3.5.2.tar.gz"
+upload-time = 2026-09-30 04:39:23.398219+00:00
+url = "https://files.pythonhosted.org/packages/33/1c/f41d4e74c28ab327ff3acd36053f7ea506c55872d7a90b0fa71aa3ab0c89/charset_normalizer-3.5.2.tar.gz"
+size = 172659
+
+[packages.sdist.hashes]
+sha256 = "39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef"
+
+[[packages.wheels]]
+name = "charset_normalizer-3.5.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+upload-time = 2026-09-30 04:37:37.397915+00:00
+url = "https://files.pythonhosted.org/packages/a0/a1/4fbf5d0f0f1b2a080474c1cf9a2f12c4c6531bb0e8ba591055e846d2b4e9/charset_normalizer-3.5.2-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+size = 257336
+
+[packages.wheels.hashes]
+sha256 = "3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229"
+
+[[packages.wheels]]
+name = "charset_normalizer-3.5.2-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl"
+upload-time = 2026-09-30 04:38:28.032254+00:00
+url = "https://files.pythonhosted.org/packages/7e/84/371eac6b30bdbcbf2d632a1a01809103459216fcaae61b8b8d922c1bfb8a/charset_normalizer-3.5.2-cp37-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl"
+size = 253276
+
+[packages.wheels.hashes]
+sha256 = "1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7"
+
+[[packages.wheels]]
+name = "charset_normalizer-3.5.2-py3-none-any.whl"
+upload-time = 2026-09-30 04:39:21.828049+00:00
+url = "https://files.pythonhosted.org/packages/fc/ad/d07d7862a62ffa6d79d68074d14823243dd235a77c45262acbf6adeb28bf/charset_normalizer-3.5.2-py3-none-any.whl"
+size = 68872
+
+[packages.wheels.hashes]
+sha256 = "b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685"
+
+[[packages]]
+name = "check-wheel-contents"
+version = "0.6.3"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "attrs" },
+ { name = "click" },
+ { name = "packaging" },
+ { name = "pydantic" },
+ { name = "wheel-filename" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "check_wheel_contents-0.6.3.tar.gz"
+upload-time = 2025-08-02 14:01:45.546952+00:00
+url = "https://files.pythonhosted.org/packages/95/37/2b9e0d38c2f668791ffe8b97711185c364d91c027e47f189c371c2348d18/check_wheel_contents-0.6.3.tar.gz"
+size = 586023
+
+[packages.sdist.hashes]
+sha256 = "10e6939e2fe4e6ce1edf2ff6ec6157808677e80782e78021ae139dd88473a442"
+
+[[packages.wheels]]
+name = "check_wheel_contents-0.6.3-py3-none-any.whl"
+upload-time = 2025-08-02 14:01:43.968164+00:00
+url = "https://files.pythonhosted.org/packages/be/05/f39fde9f31ef80b285ef5822fad4ddabf73fec62a1f02c5beb4b2f328972/check_wheel_contents-0.6.3-py3-none-any.whl"
+size = 27541
+
+[packages.wheels.hashes]
+sha256 = "5ae39c8c434b972f0740d04610759168590713175aab584b012b1b84f6771874"
+
+[[packages]]
+name = "click"
+version = "8.5.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "click-8.5.0.tar.gz"
+upload-time = 2026-08-26 13:33:14.560531+00:00
+url = "https://files.pythonhosted.org/packages/c7/0e/7fa0ef50764b67090eca4114772a2abf8b6148198475e54c660b97caeee6/click-8.5.0.tar.gz"
+size = 382235
+
+[packages.sdist.hashes]
+sha256 = "ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34"
+
+[[packages.wheels]]
+name = "click-8.5.0-py3-none-any.whl"
+upload-time = 2026-08-26 13:33:12.928043+00:00
+url = "https://files.pythonhosted.org/packages/58/50/6c0d534c5f134586a8e1ba4e330569e32f057e33372ae556463212fb4cd3/click-8.5.0-py3-none-any.whl"
+size = 125251
+
+[packages.wheels.hashes]
+sha256 = "255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360"
+
+[[packages]]
+name = "covdefaults"
+version = "2.3.0"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.7"
+dependencies = [
+ { name = "coverage" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "covdefaults-2.3.0.tar.gz"
+upload-time = 2023-03-05 16:43:34.779146+00:00
+url = "https://files.pythonhosted.org/packages/44/ee/9a6f2611f72e4c5657ae5542a510cf4164d2c673687c0ea73bb1cbd85b4d/covdefaults-2.3.0.tar.gz"
+size = 4835
+
+[packages.sdist.hashes]
+sha256 = "4e99f679f12d792bc62e5510fa3eb59546ed47bd569e36e4fddc4081c9c3ebf7"
+
+[[packages.wheels]]
+name = "covdefaults-2.3.0-py2.py3-none-any.whl"
+upload-time = 2023-03-05 16:43:33.245581+00:00
+url = "https://files.pythonhosted.org/packages/76/4c/823bc951445aa97e5a1b7e337690db3abf85212c8d138e170922e7916ac8/covdefaults-2.3.0-py2.py3-none-any.whl"
+size = 5144
+
+[packages.wheels.hashes]
+sha256 = "2832961f6ffcfe4b57c338bc3418a3526f495c26fb9c54565409c5532f7c41be"
+
+[[packages]]
+name = "coverage"
+version = "7.16.2"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "coverage-7.16.2.tar.gz"
+upload-time = 2026-09-27 12:29:01.118768+00:00
+url = "https://files.pythonhosted.org/packages/2f/55/d1eaf3e73781174340a00dc1ba2aee8a65f82fadb18e2797b192b6b3925b/coverage-7.16.2.tar.gz"
+size = 971999
+
+[packages.sdist.hashes]
+sha256 = "ca64d9f1f384f151b9511bec01126072acd2f313439f8ed015a22d8790aab6fa"
+
+[[packages.wheels]]
+name = "coverage-7.16.2-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl"
+upload-time = 2026-09-27 12:28:05.150722+00:00
+url = "https://files.pythonhosted.org/packages/de/29/48fca82a7ebf7ff7b2e35019cc9537e7f65e4d2aa1215cc5a8792c989251/coverage-7.16.2-cp315-cp315-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl"
+size = 259106
+
+[packages.wheels.hashes]
+sha256 = "8fc15cc8d0d06e873c00ef18e1372d605f9aaf3de27d8c24e50782e75bc8b843"
+
+[[packages.wheels]]
+name = "coverage-7.16.2-py3-none-any.whl"
+upload-time = 2026-09-27 12:28:59.075376+00:00
+url = "https://files.pythonhosted.org/packages/3f/0c/7a64e1ac90541a8edf50daef0914848011fb057a5bf55284a4811e21939a/coverage-7.16.2-py3-none-any.whl"
+size = 215754
+
+[packages.wheels.hashes]
+sha256 = "11d28e9123a9156cb405d8d27b44256c9a58fb5decc2073a8f17862057e3aa0f"
+
+[[packages]]
+name = "cryptography"
+version = "50.0.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = "!=3.9.0,!=3.9.1,>=3.9"
+dependencies = [
+ { name = "cffi" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "cryptography-50.0.2.tar.gz"
+upload-time = 2026-09-30 15:30:04.884601+00:00
+url = "https://files.pythonhosted.org/packages/9d/af/182eb91b0df3fe75c4d9f26fe70684569566745f6ba7e5c9c73a862c5252/cryptography-50.0.2.tar.gz"
+size = 880623
+
+[packages.sdist.hashes]
+sha256 = "7b46165bb56eb4704e2eaaf86f3c940d19154535d9b0ca7d6d590b04060e00d5"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+upload-time = 2026-09-30 14:43:49.010540+00:00
+url = "https://files.pythonhosted.org/packages/21/69/64cef1f702bf6657e0cc186ed1a2891d50d29fb41586b254e1c07adea261/cryptography-50.0.2-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+size = 4719841
+
+[packages.wheels.hashes]
+sha256 = "630ebfea3bf689d075f82316324ff7433dc447fe6bc1bfc76524b74b4a9567d2"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl"
+upload-time = 2026-09-30 14:43:55.272150+00:00
+url = "https://files.pythonhosted.org/packages/1a/f1/b474e930c4d910328780e3940da76f5aa5cbc48ce1fc14e44d239d9ea9db/cryptography-50.0.2-cp311-abi3-manylinux_2_28_x86_64.whl"
+size = 4753050
+
+[packages.wheels.hashes]
+sha256 = "4061c0079120205fb760c58acab6443e217307dcf05e3702cf970e0689972856"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl"
+upload-time = 2026-09-30 14:44:04.545137+00:00
+url = "https://files.pythonhosted.org/packages/d3/69/2c833a049475e0a3444e94c7d0aca0aa51d166374a449b09e92ac98138de/cryptography-50.0.2-cp311-abi3-manylinux_2_34_x86_64.whl"
+size = 4752576
+
+[packages.wheels.hashes]
+sha256 = "9dab55f57c74c3cad24c323bacbbd04be4705ba6eb0d92e920b1fc4837ed5079"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+upload-time = 2026-09-30 14:44:45.769143+00:00
+url = "https://files.pythonhosted.org/packages/aa/a4/2c8d734e43d97f0842ee9f1b7b4bfb3d0cf5e19edebf43c2afe6675c2320/cryptography-50.0.2-cp315-abi3.abi3t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+size = 4966465
+
+[packages.wheels.hashes]
+sha256 = "f2f9bd7f90c64fe89253f0a2c05e3c4856072660429ce8831b4235bf29403a67"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl"
+upload-time = 2026-09-30 14:44:53.379605+00:00
+url = "https://files.pythonhosted.org/packages/02/a8/8df951850d6b31d2a00218f19e2b3f999523437ed7a819df7fa427942fca/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_28_x86_64.whl"
+size = 5001199
+
+[packages.wheels.hashes]
+sha256 = "58a0c478eeca76fe5e07993c5a0703def34a6dc6a0cda4f5564639b33112ffe7"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_x86_64.whl"
+upload-time = 2026-09-30 14:45:05.009031+00:00
+url = "https://files.pythonhosted.org/packages/24/95/83378121ef3eaaaf71d4b781577ff794acb39b9e1b87a3f156898c8497ed/cryptography-50.0.2-cp315-abi3.abi3t-manylinux_2_34_x86_64.whl"
+size = 5000859
+
+[packages.wheels.hashes]
+sha256 = "e105ab60406787da31fccc883fc0f733af1efd78f0136a4599692c4083a73d0c"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+upload-time = 2026-09-30 15:29:26.807001+00:00
+url = "https://files.pythonhosted.org/packages/bf/f1/1c1f6874e8550cfddd4b688ceb38cefb6ed15ceed224d56f133f3d88c214/cryptography-50.0.2-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+size = 4749145
+
+[packages.wheels.hashes]
+sha256 = "ee247f5c245c9a2fe7c8e2214e295918838e44e00a45a6718451e4004219e767"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl"
+upload-time = 2026-09-30 15:29:32.605292+00:00
+url = "https://files.pythonhosted.org/packages/4f/87/ef344a9e616871f2519c22d6afcda79ddd5d35e9592d95eb6e677608d055/cryptography-50.0.2-cp39-abi3-manylinux_2_28_x86_64.whl"
+size = 4781387
+
+[packages.wheels.hashes]
+sha256 = "f21e8a22c8605750c7af886bab299a363721264061b4ac0a30efb73cfd58efc5"
+
+[[packages.wheels]]
+name = "cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl"
+upload-time = 2026-09-30 15:29:41.251208+00:00
+url = "https://files.pythonhosted.org/packages/40/cf/6b5c8e2fd9202d98988ab7cb5cc5c991704c4ad55f492ff408e4969f83f1/cryptography-50.0.2-cp39-abi3-manylinux_2_34_x86_64.whl"
+size = 4780973
+
+[packages.wheels.hashes]
+sha256 = "1981f1db4630889b9ef7803fadef12b056f428cb6b85c27ba57b774793b6093c"
+
+[[packages]]
+name = "cython"
+version = "3.3.0"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "cython-3.3.0.tar.gz"
+upload-time = 2026-08-22 05:16:39.493040+00:00
+url = "https://files.pythonhosted.org/packages/a9/d8/4981ef716ad0e3ff0d3ef383aefc6b03c4a88dee33b272bf8e0d833001ca/cython-3.3.0.tar.gz"
+size = 3727515
+
+[packages.sdist.hashes]
+sha256 = "eed0d93fbca7087f143b42c34b05a825849bdf17f101572c2105acfa49aa88b8"
+
+[[packages.wheels]]
+name = "cython-3.3.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+upload-time = 2026-08-22 05:17:36.538454+00:00
+url = "https://files.pythonhosted.org/packages/c9/aa/4c0b6773ecf6bc1ec6cda7db8312a566611b330fb6dae87d740e44a47822/cython-3.3.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+size = 3454285
+
+[packages.wheels.hashes]
+sha256 = "b447f6906e0555f05dc4742ef1f99091b1e5d9aa9f16616e772fbf9ff6271616"
+
+[[packages.wheels]]
+name = "cython-3.3.0-py3-none-any.whl"
+upload-time = 2026-08-22 05:16:36.741632+00:00
+url = "https://files.pythonhosted.org/packages/bf/77/67b0b24e45073a699610e50f00c18474ff9b09ea29ecc95083bdf5e60acd/cython-3.3.0-py3-none-any.whl"
+size = 1349151
+
+[packages.wheels.hashes]
+sha256 = "9b24b5c8cd536946b62086fcafee6d5509d3f549f72d553d2336af87ffbe0da1"
+
+[[packages]]
+name = "defusedxml"
+version = "0.7.1"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "defusedxml-0.7.1.tar.gz"
+upload-time = 2021-03-08 10:59:26.269532+00:00
+url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz"
+size = 75520
+
+[packages.sdist.hashes]
+sha256 = "1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"
+
+[[packages.wheels]]
+name = "defusedxml-0.7.1-py2.py3-none-any.whl"
+upload-time = 2021-03-08 10:59:24.450195+00:00
+url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl"
+size = 25604
+
+[packages.wheels.hashes]
+sha256 = "a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"
+
+[[packages]]
+name = "distlib"
+version = "0.4.4"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "distlib-0.4.4.tar.gz"
+upload-time = 2026-10-16 13:56:34.203008+00:00
+url = "https://files.pythonhosted.org/packages/68/bc/d36966de7304047a1001a7559fbf266c464bb5d8cc85464536ef8c9bcc32/distlib-0.4.4.tar.gz"
+size = 621304
+
+[packages.sdist.hashes]
+sha256 = "ca4175b4ac7f71223cc30ed7248c45d2b38c2439d8ee6e498ab67ed63cf3508d"
+
+[[packages.wheels]]
+name = "distlib-0.4.4-py2.py3-none-any.whl"
+upload-time = 2026-10-16 13:56:32.053304+00:00
+url = "https://files.pythonhosted.org/packages/c1/2b/238f02a4927fa2e27aa995371d240a468b52e42eae44a678434aff736b38/distlib-0.4.4-py2.py3-none-any.whl"
+size = 472099
+
+[packages.wheels.hashes]
+sha256 = "cf09d55b1e85a89576b036aeb71550bfd68320f3f21761ca329eadadad918638"
+
+[[packages]]
+name = "docutils"
+version = "0.22.4"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "docutils-0.22.4.tar.gz"
+upload-time = 2025-12-18 19:00:26.443107+00:00
+url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz"
+size = 2291750
+
+[packages.sdist.hashes]
+sha256 = "4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968"
+
+[[packages.wheels]]
+name = "docutils-0.22.4-py3-none-any.whl"
+upload-time = 2025-12-18 19:00:18.077803+00:00
+url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl"
+size = 633196
+
+[packages.wheels.hashes]
+sha256 = "d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de"
+
+[[packages]]
+name = "filelock"
+version = "4.2.4"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.11"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "filelock-4.2.4.tar.gz"
+upload-time = 2026-10-19 01:57:51.001795+00:00
+url = "https://files.pythonhosted.org/packages/d8/28/3893324bcadf8f89b1616637468d766af3f625008c0735bf704fdfa86617/filelock-4.2.4.tar.gz"
+size = 652444
+
+[packages.sdist.hashes]
+sha256 = "c6d8663535e1650ee430507b4ffbac7b464dd64b7647ea0112a9f406499d163d"
+
+[[packages.wheels]]
+name = "filelock-4.2.4-py3-none-any.whl"
+upload-time = 2026-10-19 01:57:49.419460+00:00
+url = "https://files.pythonhosted.org/packages/e0/1b/5e74289a1878e666bb4b65fe5805a04cafcac2aa5f519ef1ead67ef91c56/filelock-4.2.4-py3-none-any.whl"
+size = 162475
+
+[packages.wheels.hashes]
+sha256 = "301241438c57936ef93f4243a94f2559022268bfcf9b375a9a72eb0f8db8358e"
+
+[[packages]]
+name = "hatch-fancy-pypi-readme"
+version = "25.1.0"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.8"
+dependencies = [
+ { name = "hatchling" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "hatch_fancy_pypi_readme-25.1.0.tar.gz"
+upload-time = 2025-05-01 10:34:42.989334+00:00
+url = "https://files.pythonhosted.org/packages/f3/0f/aed57c301f339936eb91cb4d8c1e5088a101081854bd3ec18a889df32365/hatch_fancy_pypi_readme-25.1.0.tar.gz"
+size = 29701
+
+[packages.sdist.hashes]
+sha256 = "9c58ed3dff90d51f43414ce37009ad1d5b0f08ffc9fc216998a06380f01c0045"
+
+[[packages.wheels]]
+name = "hatch_fancy_pypi_readme-25.1.0-py3-none-any.whl"
+upload-time = 2025-05-01 10:34:41.204793+00:00
+url = "https://files.pythonhosted.org/packages/58/b4/ad71e051b34f1935783de37beffee16e343ff2514b204dc515f9e939d4af/hatch_fancy_pypi_readme-25.1.0-py3-none-any.whl"
+size = 10046
+
+[packages.wheels.hashes]
+sha256 = "ce0134c40d63d874ac48f48ccc678b8f3b62b8e50e9318520d2bffc752eedaf3"
+
+[[packages]]
+name = "hatch-vcs"
+version = "0.5.0"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "hatchling" },
+ { name = "setuptools-scm" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "hatch_vcs-0.5.0.tar.gz"
+upload-time = 2025-05-27 05:16:04.490926+00:00
+url = "https://files.pythonhosted.org/packages/6b/b0/4cc743d38adbee9d57d786fa496ed1daadb17e48589b6da8fa55717a0746/hatch_vcs-0.5.0.tar.gz"
+size = 11424
+
+[packages.sdist.hashes]
+sha256 = "0395fa126940340215090c344a2bf4e2a77bcbe7daab16f41b37b98c95809ff9"
+
+[[packages.wheels]]
+name = "hatch_vcs-0.5.0-py3-none-any.whl"
+upload-time = 2025-05-27 05:16:03.184909+00:00
+url = "https://files.pythonhosted.org/packages/5f/48/1f85cee4b7b4f40b9b814b1febbc661bda6ced9649e410a0b74f6e415dd0/hatch_vcs-0.5.0-py3-none-any.whl"
+size = 8507
+
+[packages.wheels.hashes]
+sha256 = "b49677dbdc597460cc22d01b27ab3696f5e16a21ecf2700fb01bc28e1f2a04a7"
+
+[[packages]]
+name = "hatchling"
+version = "1.32.4"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "packaging" },
+ { name = "pathspec" },
+ { name = "pluggy" },
+ { name = "tomlkit" },
+ { name = "trove-classifiers" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "hatchling-1.32.4.tar.gz"
+upload-time = 2026-09-20 22:48:45.398505+00:00
+url = "https://files.pythonhosted.org/packages/f6/97/b5312f01a8c6daf729a9d272dd442e0c546dbcc630495788786c4b567ed0/hatchling-1.32.4.tar.gz"
+size = 58065
+
+[packages.sdist.hashes]
+sha256 = "c4468f73144c054d2aab4ef0f0378c43b9878bf07f8ffd6b79690e970d375f07"
+
+[[packages.wheels]]
+name = "hatchling-1.32.4-py3-none-any.whl"
+upload-time = 2026-09-20 22:48:44.190681+00:00
+url = "https://files.pythonhosted.org/packages/5f/80/91f51f439c05d4ec4623c22928ce16a938d6d793bf709477830823497859/hatchling-1.32.4-py3-none-any.whl"
+size = 78748
+
+[packages.wheels.hashes]
+sha256 = "08ecf7548fb48205e7f213d70c71e67b8271b7242093dc3f1da578b42c734a2c"
+
+[[packages]]
+name = "id"
+version = "1.6.1"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "urllib3" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "id-1.6.1.tar.gz"
+upload-time = 2026-02-04 16:19:41.260133+00:00
+url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz"
+size = 18088
+
+[packages.sdist.hashes]
+sha256 = "d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069"
+
+[[packages.wheels]]
+name = "id-1.6.1-py3-none-any.whl"
+upload-time = 2026-02-04 16:19:40.051745+00:00
+url = "https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl"
+size = 14689
+
+[packages.wheels.hashes]
+sha256 = "f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca"
+
+[[packages]]
+name = "identify"
+version = "2.6.20"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "identify-2.6.20.tar.gz"
+upload-time = 2026-09-26 20:29:07.187608+00:00
+url = "https://files.pythonhosted.org/packages/53/35/d70c0006c7cee65999ea94a6273e60b2094f600a3d8b71b04318253fc643/identify-2.6.20.tar.gz"
+size = 99681
+
+[packages.sdist.hashes]
+sha256 = "ad729860a923858d26917c2f4fb0a1d83d27a75b1e090c06440c573f048f3285"
+
+[[packages.wheels]]
+name = "identify-2.6.20-py2.py3-none-any.whl"
+upload-time = 2026-09-26 20:29:06.054092+00:00
+url = "https://files.pythonhosted.org/packages/fa/70/fffc9613501877c0a10a1ef73a165e6ded3e53f6e7502227fef56d973933/identify-2.6.20-py2.py3-none-any.whl"
+size = 99506
+
+[packages.wheels.hashes]
+sha256 = "6a16b69b93187244e0548cbfd25b3e4a6f9a7a2ad784625c3bec2b8d27b81aaa"
+
+[[packages]]
+name = "idna"
+version = "3.20"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "idna-3.20.tar.gz"
+upload-time = 2026-09-17 14:11:04.752193+00:00
+url = "https://files.pythonhosted.org/packages/f5/08/8eea9d4b8302028f3abb2c0813953f7aec26d33b7a8960ed760e65ff29fa/idna-3.20.tar.gz"
+size = 216463
+
+[packages.sdist.hashes]
+sha256 = "a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44"
+
+[[packages.wheels]]
+name = "idna-3.20-py3-none-any.whl"
+upload-time = 2026-09-17 14:11:03.168153+00:00
+url = "https://files.pythonhosted.org/packages/58/a2/bb081bab032533a855d44de1d56f8e8426114ff1ba5d1f07a438a0a654f8/idna-3.20-py3-none-any.whl"
+size = 69583
+
+[packages.wheels.hashes]
+sha256 = "ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c"
+
+[[packages]]
+name = "imagesize"
+version = "2.0.1"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "imagesize-2.0.1.tar.gz"
+upload-time = 2026-08-24 12:35:19.130667+00:00
+url = "https://files.pythonhosted.org/packages/fb/5e/513ff06670c84e7b9887c1fdf61b2d42b4f574a831f2f1d2222023049d8a/imagesize-2.0.1.tar.gz"
+size = 1883774
+
+[packages.sdist.hashes]
+sha256 = "b2ba6a4dea487a7ebcd53248d3476aca449d30db12a2dde5e0c5ca9624fd77e5"
+
+[[packages.wheels]]
+name = "imagesize-2.0.1-py3-none-any.whl"
+upload-time = 2026-08-24 12:35:12.548956+00:00
+url = "https://files.pythonhosted.org/packages/01/f9/575c8d760eae1fc99651b7cc5efd96ad5379ca4d6b53750b0fb4fe983f34/imagesize-2.0.1-py3-none-any.whl"
+size = 14794
+
+[packages.wheels.hashes]
+sha256 = "ea0c9a0384df69ed86a943a15cde37d0360b82491b3910dc2215e202e62b5b02"
+
+[[packages]]
+name = "iniconfig"
+version = "2.3.1"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "iniconfig-2.3.1.tar.gz"
+upload-time = 2026-10-06 22:48:38.076390+00:00
+url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz"
+size = 21209
+
+[packages.sdist.hashes]
+sha256 = "67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960"
+
+[[packages.wheels]]
+name = "iniconfig-2.3.1-py3-none-any.whl"
+upload-time = 2026-10-06 22:48:36.959685+00:00
+url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl"
+size = 7552
+
+[packages.wheels.hashes]
+sha256 = "9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7"
+
+[[packages]]
+name = "jaraco-classes"
+version = "3.4.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.8"
+dependencies = [
+ { name = "more-itertools" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "jaraco.classes-3.4.0.tar.gz"
+upload-time = 2024-03-31 07:27:36.643708+00:00
+url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz"
+size = 11780
+
+[packages.sdist.hashes]
+sha256 = "47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd"
+
+[[packages.wheels]]
+name = "jaraco.classes-3.4.0-py3-none-any.whl"
+upload-time = 2024-03-31 07:27:34.792832+00:00
+url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl"
+size = 6777
+
+[packages.wheels.hashes]
+sha256 = "f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790"
+
+[[packages]]
+name = "jaraco-context"
+version = "6.1.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "jaraco_context-6.1.2.tar.gz"
+upload-time = 2026-03-20 22:13:33.922545+00:00
+url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz"
+size = 16801
+
+[packages.sdist.hashes]
+sha256 = "f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3"
+
+[[packages.wheels]]
+name = "jaraco_context-6.1.2-py3-none-any.whl"
+upload-time = 2026-03-20 22:13:32.808832+00:00
+url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl"
+size = 7871
+
+[packages.wheels.hashes]
+sha256 = "bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535"
+
+[[packages]]
+name = "jaraco-functools"
+version = "4.6.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "more-itertools" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "jaraco_functools-4.6.0.tar.gz"
+upload-time = 2026-07-14 01:28:02.544761+00:00
+url = "https://files.pythonhosted.org/packages/6c/1f/c23395957d41ccf27c4e535c3d334c4051e5395b3752057ba4cbaec35c56/jaraco_functools-4.6.0.tar.gz"
+size = 20837
+
+[packages.sdist.hashes]
+sha256 = "880c577ec9720b3a052d5bc611fb9f2269b3d87902ef42440df443b88e443280"
+
+[[packages.wheels]]
+name = "jaraco_functools-4.6.0-py3-none-any.whl"
+upload-time = 2026-07-14 01:28:01.590470+00:00
+url = "https://files.pythonhosted.org/packages/02/36/ecc85bc96c273dc8a11273ed4782272975e6338d4a3e9228621175edf0e3/jaraco_functools-4.6.0-py3-none-any.whl"
+size = 11677
+
+[packages.wheels.hashes]
+sha256 = "99e3dc0060c5cbe8fcd1cdb36258e2a65ca40f1566b2033b12abb1bb44dd3c30"
+
+[[packages]]
+name = "jeepney"
+version = "0.9.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "jeepney-0.9.0.tar.gz"
+upload-time = 2025-02-27 18:51:01.684959+00:00
+url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz"
+size = 106758
+
+[packages.sdist.hashes]
+sha256 = "cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732"
+
+[[packages.wheels]]
+name = "jeepney-0.9.0-py3-none-any.whl"
+upload-time = 2025-02-27 18:51:00.104279+00:00
+url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl"
+size = 49010
+
+[packages.wheels.hashes]
+sha256 = "97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683"
+
+[[packages]]
+name = "jinja2"
+version = "3.1.6"
+marker = "\"project-runtime\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.7"
+dependencies = [
+ { name = "markupsafe" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "jinja2-3.1.6.tar.gz"
+upload-time = 2025-03-05 20:05:02.478302+00:00
+url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz"
+size = 245115
+
+[packages.sdist.hashes]
+sha256 = "0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"
+
+[[packages.wheels]]
+name = "jinja2-3.1.6-py3-none-any.whl"
+upload-time = 2025-03-05 20:05:00.369721+00:00
+url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl"
+size = 134899
+
+[packages.wheels.hashes]
+sha256 = "85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"
+
+[[packages]]
+name = "keyring"
+version = "25.7.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "jaraco-classes" },
+ { name = "jaraco-context" },
+ { name = "jaraco-functools" },
+ { name = "jeepney" },
+ { name = "secretstorage" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "keyring-25.7.0.tar.gz"
+upload-time = 2025-11-16 16:26:09.482176+00:00
+url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz"
+size = 63516
+
+[packages.sdist.hashes]
+sha256 = "fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b"
+
+[[packages.wheels]]
+name = "keyring-25.7.0-py3-none-any.whl"
+upload-time = 2025-11-16 16:26:08.402146+00:00
+url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl"
+size = 39160
+
+[packages.wheels.hashes]
+sha256 = "be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f"
+
+[[packages]]
+name = "markdown-it-py"
+version = "4.2.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "mdurl" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "markdown_it_py-4.2.0.tar.gz"
+upload-time = 2026-05-07 12:08:28.360612+00:00
+url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz"
+size = 82454
+
+[packages.sdist.hashes]
+sha256 = "04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49"
+
+[[packages.wheels]]
+name = "markdown_it_py-4.2.0-py3-none-any.whl"
+upload-time = 2026-05-07 12:08:27.182789+00:00
+url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl"
+size = 91687
+
+[packages.wheels.hashes]
+sha256 = "9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a"
+
+[[packages]]
+name = "markupsafe"
+version = "3.0.4"
+marker = "\"project-runtime\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "markupsafe-3.0.4.tar.gz"
+upload-time = 2026-10-02 23:07:22.290270+00:00
+url = "https://files.pythonhosted.org/packages/38/9b/e422a865e1d5d57d0e509b4e0bf1c1a70a7f6382c29a5aa428df994c8bc8/markupsafe-3.0.4.tar.gz"
+size = 153777
+
+[packages.sdist.hashes]
+sha256 = "2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6"
+
+[[packages.wheels]]
+name = "markupsafe-3.0.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+upload-time = 2026-10-02 23:06:22.524416+00:00
+url = "https://files.pythonhosted.org/packages/82/96/ef49135ce260db4ca4a12b119ed468449cd248db6b1468e2112b546d7a2e/markupsafe-3.0.4-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl"
+size = 23111
+
+[packages.wheels.hashes]
+sha256 = "925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369"
+
+[[packages]]
+name = "mdformat"
+version = "1.0.0"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "markdown-it-py" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "mdformat-1.0.0.tar.gz"
+upload-time = 2025-10-16 12:05:03.695033+00:00
+url = "https://files.pythonhosted.org/packages/3f/05/32b5e14b192b0a8a309f32232c580aefedd9d06017cb8fe8fce34bec654c/mdformat-1.0.0.tar.gz"
+size = 56953
+
+[packages.sdist.hashes]
+sha256 = "4954045fcae797c29f86d4ad879e43bb151fa55dbaf74ac6eaeacf1d45bb3928"
+
+[[packages.wheels]]
+name = "mdformat-1.0.0-py3-none-any.whl"
+upload-time = 2025-10-16 12:05:02.607432+00:00
+url = "https://files.pythonhosted.org/packages/54/9a/8fe71b95985ca7a4001effbcc58e5a07a1f2a2884203f74dcf48a3b08315/mdformat-1.0.0-py3-none-any.whl"
+size = 53288
+
+[packages.wheels.hashes]
+sha256 = "bca015d65a1d063a02e885a91daee303057bc7829c2cd37b2075a50dbb65944b"
+
+[[packages]]
+name = "mdformat-gfm"
+version = "1.0.0"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "mdformat" },
+ { name = "mdit-py-plugins" },
+ { name = "wcwidth" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "mdformat_gfm-1.0.0.tar.gz"
+upload-time = 2025-10-16 09:12:22.402429+00:00
+url = "https://files.pythonhosted.org/packages/56/6f/a626ebb142a290474401b67e2d61e73ce096bf7798ee22dfe6270f924b3f/mdformat_gfm-1.0.0.tar.gz"
+size = 10112
+
+[packages.sdist.hashes]
+sha256 = "d1d49a409a6acb774ce7635c72d69178df7dce1dc8cdd10e19f78e8e57b72623"
+
+[[packages.wheels]]
+name = "mdformat_gfm-1.0.0-py3-none-any.whl"
+upload-time = 2025-10-16 09:12:21.276157+00:00
+url = "https://files.pythonhosted.org/packages/e6/18/6bc2189b744dd383cad03764f41f30352b1278d2205096f77a29c0b327ad/mdformat_gfm-1.0.0-py3-none-any.whl"
+size = 10970
+
+[packages.wheels.hashes]
+sha256 = "7305a50efd2a140d7c83505b58e3ac5df2b09e293f9bbe72f6c7bee8c678b005"
+
+[[packages]]
+name = "mdit-py-plugins"
+version = "0.6.1"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "markdown-it-py" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "mdit_py_plugins-0.6.1.tar.gz"
+upload-time = 2026-05-13 09:03:38.910230+00:00
+url = "https://files.pythonhosted.org/packages/59/fc/f8d0863f8862f25602c0404d75568e89fb6b4109804645e5cdfb1be5cf56/mdit_py_plugins-0.6.1.tar.gz"
+size = 56114
+
+[packages.sdist.hashes]
+sha256 = "a2bca0f039f39dbd35fb74ae1b5f998608c437463371f0ff7f49a19a17a114d0"
+
+[[packages.wheels]]
+name = "mdit_py_plugins-0.6.1-py3-none-any.whl"
+upload-time = 2026-05-13 09:03:37.760000+00:00
+url = "https://files.pythonhosted.org/packages/a5/69/6da5581c6a7fede7dc261bf4e67d6adca4196f176b43288b55b3db395b6e/mdit_py_plugins-0.6.1-py3-none-any.whl"
+size = 66663
+
+[packages.wheels.hashes]
+sha256 = "214c82fb2ac524472ab6a5bcab1de80f73b50443e187f401bfd77efbc7c6481d"
+
+[[packages]]
+name = "mdurl"
+version = "0.1.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "mdurl-0.1.2.tar.gz"
+upload-time = 2022-08-14 12:40:10.846281+00:00
+url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz"
+size = 8729
+
+[packages.sdist.hashes]
+sha256 = "bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"
+
+[[packages.wheels]]
+name = "mdurl-0.1.2-py3-none-any.whl"
+upload-time = 2022-08-14 12:40:09.779676+00:00
+url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl"
+size = 9979
+
+[packages.wheels.hashes]
+sha256 = "84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"
+
+[[packages]]
+name = "more-itertools"
+version = "11.2.1"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.11"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "more_itertools-11.2.1.tar.gz"
+upload-time = 2026-10-14 18:50:30.407709+00:00
+url = "https://files.pythonhosted.org/packages/52/b8/c63995bebbb9ac9c059350e0fb8c82c2420c85aeca7d34e40aecf3df9281/more_itertools-11.2.1.tar.gz"
+size = 154133
+
+[packages.sdist.hashes]
+sha256 = "cbf08fd0af284dc69718b9b76a8e6203df624d70209ea511e4219d350c856f63"
+
+[[packages.wheels]]
+name = "more_itertools-11.2.1-py3-none-any.whl"
+upload-time = 2026-10-14 18:50:29.116732+00:00
+url = "https://files.pythonhosted.org/packages/5d/57/3c4b1c6f2e0cc29ba023802458ea3d2a996f87085559e4a5f2192d549532/more_itertools-11.2.1-py3-none-any.whl"
+size = 74405
+
+[packages.wheels.hashes]
+sha256 = "35a7377edd1dd6608dcb2cdf534ded55ea32d49448875ad042cd3f879fb1ded0"
+
+[[packages]]
+name = "nh3"
+version = "0.3.7"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "nh3-0.3.7.tar.gz"
+upload-time = 2026-08-23 14:26:30.728660+00:00
+url = "https://files.pythonhosted.org/packages/18/2f/022b27146d52d24b1b353b003359134788ecbcd6fcdf6283adbd57c0fbc8/nh3-0.3.7.tar.gz"
+size = 25662
+
+[packages.sdist.hashes]
+sha256 = "71860d01c16f4d8c72e334e0674beb2b0899dbd0bf760de18932ef4390303848"
+
+[[packages.wheels]]
+name = "nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+upload-time = 2026-08-23 14:26:17.272038+00:00
+url = "https://files.pythonhosted.org/packages/a6/ed/c5510c615dce55b6fcc364aa1838142f938beed64f5e4927490dfcaf4405/nh3-0.3.7-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+size = 832161
+
+[packages.wheels.hashes]
+sha256 = "70f5ac8626e899a4bab0ef74ca2f5bd602f49c7b739e6e5026b4afc6d63dac42"
+
+[[packages]]
+name = "nodeenv"
+version = "1.11.0"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "nodeenv-1.11.0.tar.gz"
+upload-time = 2026-09-26 11:29:21.367929+00:00
+url = "https://files.pythonhosted.org/packages/9a/8e/105de02c1322cfada6d9710d9146ef8026419d433c9d08359a2d35805811/nodeenv-1.11.0.tar.gz"
+size = 99301
+
+[packages.sdist.hashes]
+sha256 = "3ce8fe5b71d16e8af7039ca65257354100bc772965d6bc549070649e53b1b146"
+
+[[packages.wheels]]
+name = "nodeenv-1.11.0-py2.py3-none-any.whl"
+upload-time = 2026-09-26 11:29:19.933601+00:00
+url = "https://files.pythonhosted.org/packages/54/c8/12811c9b48fde162bb72b6f2e78fada9a247a09d7bb5be2050a5d099c77b/nodeenv-1.11.0-py2.py3-none-any.whl"
+size = 34277
+
+[packages.wheels.hashes]
+sha256 = "edaa16e6c14d7cf395d75d4bbd5a26390f4dc06501a33b4e76282b02cc688a25"
+
+[[packages]]
+name = "packaging"
+version = "26.3"
+marker = "\"build\" in dependency_groups or \"dev\" in dependency_groups or \"lint\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "packaging-26.3.tar.gz"
+upload-time = 2026-08-04 18:15:28.737071+00:00
+url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz"
+size = 313412
+
+[packages.sdist.hashes]
+sha256 = "94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79"
+
+[[packages.wheels]]
+name = "packaging-26.3-py3-none-any.whl"
+upload-time = 2026-08-04 18:15:27.159957+00:00
+url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl"
+size = 129956
+
+[packages.wheels.hashes]
+sha256 = "d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c"
+
+[[packages]]
+name = "pathspec"
+version = "1.1.1"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pathspec-1.1.1.tar.gz"
+upload-time = 2026-04-27 01:46:08.907631+00:00
+url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz"
+size = 135180
+
+[packages.sdist.hashes]
+sha256 = "17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a"
+
+[[packages.wheels]]
+name = "pathspec-1.1.1-py3-none-any.whl"
+upload-time = 2026-04-27 01:46:07.060850+00:00
+url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl"
+size = 57328
+
+[packages.wheels.hashes]
+sha256 = "a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189"
+
+[[packages]]
+name = "platformdirs"
+version = "4.13.5"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.11"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "platformdirs-4.13.5.tar.gz"
+upload-time = 2026-10-19 01:02:11.778459+00:00
+url = "https://files.pythonhosted.org/packages/58/e6/d0abbb256b44e6a05748c6942511ff67db8dbb068de0c35b24bf1b395b09/platformdirs-4.13.5.tar.gz"
+size = 62362
+
+[packages.sdist.hashes]
+sha256 = "05831adf87d392760f4b5c3a0a95579ab5a10b18b9b9bd43680dcb47544788a0"
+
+[[packages.wheels]]
+name = "platformdirs-4.13.5-py3-none-any.whl"
+upload-time = 2026-10-19 01:02:10.170818+00:00
+url = "https://files.pythonhosted.org/packages/6c/8a/1d8cb3842909dc193a73835adedf412e32e18f8ffd59f43983949622fe6f/platformdirs-4.13.5-py3-none-any.whl"
+size = 32779
+
+[packages.wheels.hashes]
+sha256 = "53d3ec4280b815c1e0b02edad7f9ee8fda1ba9c0865dd9c2e6e63849ce82fc1e"
+
+[[packages]]
+name = "pluggy"
+version = "1.7.0"
+marker = "\"build\" in dependency_groups or \"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pluggy-1.7.0.tar.gz"
+upload-time = 2026-10-15 09:50:58.343484+00:00
+url = "https://files.pythonhosted.org/packages/bf/db/7fc19e6f2dc92a966727031389fc2e08b558f0f25eb7403c1119ad4713cd/pluggy-1.7.0.tar.gz"
+size = 123304
+
+[packages.sdist.hashes]
+sha256 = "d1eaa46ebb595891b860ab086b4d09c8588af65ebd4361b8e8f4bb8920b90ba8"
+
+[[packages.wheels]]
+name = "pluggy-1.7.0-py3-none-any.whl"
+upload-time = 2026-10-15 09:50:56.808462+00:00
+url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl"
+size = 27082
+
+[packages.wheels.hashes]
+sha256 = "7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec"
+
+[[packages]]
+name = "pre-commit"
+version = "4.7.0"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.11"
+dependencies = [
+ { name = "cfgv" },
+ { name = "identify" },
+ { name = "nodeenv" },
+ { name = "pyyaml" },
+ { name = "virtualenv" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pre_commit-4.7.0.tar.gz"
+upload-time = 2026-10-12 20:45:40.320969+00:00
+url = "https://files.pythonhosted.org/packages/3a/c3/6965c2690ddce885ec75121572d065a5b94c5a5d8d3e657927ecda9fd715/pre_commit-4.7.0.tar.gz"
+size = 198120
+
+[packages.sdist.hashes]
+sha256 = "1f3deee12b914c8fa184bd2b5953391c2e4f36763e403d4a23dc9983fa7c6e86"
+
+[[packages.wheels]]
+name = "pre_commit-4.7.0-py2.py3-none-any.whl"
+upload-time = 2026-10-12 20:45:38.858255+00:00
+url = "https://files.pythonhosted.org/packages/eb/83/ce0a196e4f7b20b11ce3aa1fc72fb973f64b7628d51c1b8aebad37fb7f81/pre_commit-4.7.0-py2.py3-none-any.whl"
+size = 226261
+
+[packages.wheels.hashes]
+sha256 = "2e229038ad3656081b70c27913157e4b636ef306f643f024a8a8e3f0f7b2f877"
+
+[[packages]]
+name = "pre-commit-uv"
+version = "4.4.0"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.11"
+dependencies = [
+ { name = "pre-commit" },
+ { name = "uv" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pre_commit_uv-4.4.0.tar.gz"
+upload-time = 2026-10-11 00:27:45.724147+00:00
+url = "https://files.pythonhosted.org/packages/95/3c/65ca92a8343efcf16107824d01c4664bb9a2b2e8b7fb4efc954375e56c26/pre_commit_uv-4.4.0.tar.gz"
+size = 7591
+
+[packages.sdist.hashes]
+sha256 = "8e1b91485fdaba0673fc0f81229cab364c00fb6193b5fe0bcee2862b1a4ce1d4"
+
+[[packages.wheels]]
+name = "pre_commit_uv-4.4.0-py3-none-any.whl"
+upload-time = 2026-10-11 00:27:44.627800+00:00
+url = "https://files.pythonhosted.org/packages/29/fa/d5fe0626ce7a70510e6fbf2c6a9f6da4f1cbc42b86542ada1eae0eea6b55/pre_commit_uv-4.4.0-py3-none-any.whl"
+size = 6209
+
+[packages.wheels.hashes]
+sha256 = "9012b09950a50efdcfb03b95355e1f65c14f9a5cb425d12c6bf2c6d6807617d7"
+
+[[packages]]
+name = "prek"
+version = "0.5.6"
+marker = "\"release-prepare\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "prek-0.5.6.tar.gz"
+upload-time = 2026-10-19 05:46:52.314250+00:00
+url = "https://files.pythonhosted.org/packages/4f/96/c4062bcaebdabfa945d07c424fb8c05d53a72d4f3fdcf255b1188abbb150/prek-0.5.6.tar.gz"
+size = 579962
+
+[packages.sdist.hashes]
+sha256 = "87a8c19f873b96be809b4368959ed908cfa06255dba15082d0fb91173e9293bc"
+
+[[packages.wheels]]
+name = "prek-0.5.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+upload-time = 2026-10-19 05:46:42.326947+00:00
+url = "https://files.pythonhosted.org/packages/e1/f7/04e08d2343ce1d54c5da879e2dfea7df20f3140b1b2023a937fac87fa545/prek-0.5.6-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+size = 6165929
+
+[packages.wheels.hashes]
+sha256 = "aabec01beeb372bcdc48f6b339021bc33c07edf477b337fc92dc5d3b01f99150"
+
+[[packages]]
+name = "pycparser"
+version = "3.11"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pycparser-3.11.tar.gz"
+upload-time = 2026-10-09 12:56:59.539345+00:00
+url = "https://files.pythonhosted.org/packages/da/a8/c5fdbeee588bb8ada9458774f43adf1bdd30bd59157055142183e769a024/pycparser-3.11.tar.gz"
+size = 113796
+
+[packages.sdist.hashes]
+sha256 = "d875f09c3507d00e1aba0eecc6dcadc1352f30fff09dc6bff2f1c2935e97c2bc"
+
+[[packages.wheels]]
+name = "pycparser-3.11-py3-none-any.whl"
+upload-time = 2026-10-09 12:56:58.131173+00:00
+url = "https://files.pythonhosted.org/packages/90/11/0e6f11117525ff0eec40ebac3d313376f102df93ca44ad9e893ee85e4f89/pycparser-3.11-py3-none-any.whl"
+size = 51178
+
+[packages.wheels.hashes]
+sha256 = "51d5a8ba2be0bbe440b99d2112604c95bbbc3c2748a64260186c541e1729cd80"
+
+[[packages]]
+name = "pydantic"
+version = "2.14.1"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "annotated-types" },
+ { name = "pydantic-core" },
+ { name = "typing-extensions" },
+ { name = "typing-inspection" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pydantic-2.14.1.tar.gz"
+upload-time = 2026-10-11 18:37:55.396662+00:00
+url = "https://files.pythonhosted.org/packages/7c/0b/8e10b2e693af8ec54346a14caf36221334775975a747c9ceaa3f8371d96d/pydantic-2.14.1.tar.gz"
+size = 900362
+
+[packages.sdist.hashes]
+sha256 = "94f478203dd03404682a1ada216965651dd74b1d2d5ffd62e00e0837caab5c26"
+
+[[packages.wheels]]
+name = "pydantic-2.14.1-py3-none-any.whl"
+upload-time = 2026-10-11 18:37:53.437059+00:00
+url = "https://files.pythonhosted.org/packages/35/ea/a56b9fe5066f3537b7882f77e9c5dfb26d8c2eefdaed9b5fc73d57b4dc22/pydantic-2.14.1-py3-none-any.whl"
+size = 488106
+
+[packages.wheels.hashes]
+sha256 = "9195d967ec791692a04438115466764fb8b9a27b31f14a760437694f40d6b454"
+
+[[packages]]
+name = "pydantic-core"
+version = "2.50.1"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "typing-extensions" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pydantic_core-2.50.1.tar.gz"
+upload-time = 2026-10-11 18:35:44.820993+00:00
+url = "https://files.pythonhosted.org/packages/a6/24/af4ec4be49fbc810f35b0bdcacc3d433b56bbfa469fd3bfd4ae116cd9bf1/pydantic_core-2.50.1.tar.gz"
+size = 513515
+
+[packages.sdist.hashes]
+sha256 = "e50d7b94baac6c7d09927fa5ca5800a0c7ee5015c7fcff65beb3a1931b5a6e09"
+
+[[packages.wheels]]
+name = "pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+upload-time = 2026-10-11 18:34:15.560294+00:00
+url = "https://files.pythonhosted.org/packages/b8/0d/1b1149f60a00ea21ba5f70e28acbd40feb4598af414f80f53c921fac07c9/pydantic_core-2.50.1-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+size = 2159961
+
+[packages.wheels.hashes]
+sha256 = "7689580e72a642ab5ec64d5f55b2e33636fa43b4ebe63c0c2c965ef307c7d1aa"
+
+[[packages]]
+name = "pygments"
+version = "2.21.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pygments-2.21.0.tar.gz"
+upload-time = 2026-08-17 08:02:48.824391+00:00
+url = "https://files.pythonhosted.org/packages/49/2e/ced460408999b33da6b31b0021b0f37d329e202d4169aeb164493778f25b/pygments-2.21.0.tar.gz"
+size = 5005329
+
+[packages.sdist.hashes]
+sha256 = "610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c"
+
+[[packages.wheels]]
+name = "pygments-2.21.0-py3-none-any.whl"
+upload-time = 2026-08-17 08:02:44.912148+00:00
+url = "https://files.pythonhosted.org/packages/71/46/17f022dd3e953bf20a04a028a21ec746d942f8d2af30fa0f124fa0e6a684/pygments-2.21.0-py3-none-any.whl"
+size = 1250147
+
+[packages.wheels.hashes]
+sha256 = "2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9"
+
+[[packages]]
+name = "pytest"
+version = "9.1.1"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "iniconfig" },
+ { name = "packaging" },
+ { name = "pluggy" },
+ { name = "pygments" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pytest-9.1.1.tar.gz"
+upload-time = 2026-06-19 10:58:32.857420+00:00
+url = "https://files.pythonhosted.org/packages/e4/47/b9efed96c114afcfa3c9d3fe98a76a1d14c74a9e266d397cf6eb64be5e01/pytest-9.1.1.tar.gz"
+size = 1636369
+
+[packages.sdist.hashes]
+sha256 = "1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313"
+
+[[packages.wheels]]
+name = "pytest-9.1.1-py3-none-any.whl"
+upload-time = 2026-06-19 10:58:31.347074+00:00
+url = "https://files.pythonhosted.org/packages/24/25/1de2678b631f5a49215c6c96fff41ba892b0a34df68d6d80292b1b48aa7f/pytest-9.1.1-py3-none-any.whl"
+size = 386536
+
+[packages.wheels.hashes]
+sha256 = "37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c"
+
+[[packages]]
+name = "pytest-cov"
+version = "7.1.0"
+marker = "\"dev\" in dependency_groups or \"test\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "coverage" },
+ { name = "pluggy" },
+ { name = "pytest" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pytest_cov-7.1.0.tar.gz"
+upload-time = 2026-03-21 20:11:16.284275+00:00
+url = "https://files.pythonhosted.org/packages/b1/51/a849f96e117386044471c8ec2bd6cfebacda285da9525c9106aeb28da671/pytest_cov-7.1.0.tar.gz"
+size = 55592
+
+[packages.sdist.hashes]
+sha256 = "30674f2b5f6351aa09702a9c8c364f6a01c27aae0c1366ae8016160d1efc56b2"
+
+[[packages.wheels]]
+name = "pytest_cov-7.1.0-py3-none-any.whl"
+upload-time = 2026-03-21 20:11:14.438324+00:00
+url = "https://files.pythonhosted.org/packages/9d/7a/d968e294073affff457b041c2be9868a40c1c71f4a35fcc1e45e5493067b/pytest_cov-7.1.0-py3-none-any.whl"
+size = 22876
+
+[packages.wheels.hashes]
+sha256 = "a0461110b7865f9a271aa1b51e516c9a95de9d696734a2f71e3e78f46e1d4678"
+
+[[packages]]
+name = "python-discovery"
+version = "1.6.4"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "filelock" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "python_discovery-1.6.4.tar.gz"
+upload-time = 2026-10-19 01:45:14.855085+00:00
+url = "https://files.pythonhosted.org/packages/f3/ee/cf608372c88ce2c136ee13c69ab6f667dbc0d0c1176af188b4ddc8853e66/python_discovery-1.6.4.tar.gz"
+size = 89883
+
+[packages.sdist.hashes]
+sha256 = "bc70d31f0ec5de11eda13d4d64c16e24b3506a65984684f2b6c98cb83b2ea9df"
+
+[[packages.wheels]]
+name = "python_discovery-1.6.4-py3-none-any.whl"
+upload-time = 2026-10-19 01:45:13.668192+00:00
+url = "https://files.pythonhosted.org/packages/60/91/1aa70d3dfcab0dbcf88a2cbc3bce7f7c69562287a90216e617eaa4937e25/python_discovery-1.6.4-py3-none-any.whl"
+size = 39385
+
+[packages.wheels.hashes]
+sha256 = "530179cc51a1816d512b15635b3dc931295ae12efb183783ad31190a5d425d2b"
+
+[[packages]]
+name = "pyyaml"
+version = "6.0.3"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups or \"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "pyyaml-6.0.3.tar.gz"
+upload-time = 2025-09-25 21:33:16.546886+00:00
+url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz"
+size = 130960
+
+[packages.sdist.hashes]
+sha256 = "d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"
+
+[[packages]]
+name = "readme-renderer"
+version = "46.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "docutils" },
+ { name = "nh3" },
+ { name = "pygments" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "readme_renderer-46.0.tar.gz"
+upload-time = 2026-08-28 15:18:32.490778+00:00
+url = "https://files.pythonhosted.org/packages/25/d7/9309494fad74ee831d4546f69325b5519f37c6dfb2d9ba495db8c6d4f4ca/readme_renderer-46.0.tar.gz"
+size = 38382
+
+[packages.sdist.hashes]
+sha256 = "af3e964914f6310a33ff67b72a4bdd940bed8d7c3bdecd2d14f40edf284bfe90"
+
+[[packages.wheels]]
+name = "readme_renderer-46.0-py3-none-any.whl"
+upload-time = 2026-08-28 15:18:31.132970+00:00
+url = "https://files.pythonhosted.org/packages/4b/72/ac5ca81fe9121fcaa9d828d21017cba00a16a98e4ea5fb60c878f93dda4f/readme_renderer-46.0-py3-none-any.whl"
+size = 14239
+
+[packages.wheels.hashes]
+sha256 = "d0dae1f74bb273b534770cb4cccb6bb78735540afdb03c2146f4e19dcd412560"
+
+[[packages]]
+name = "release-creator"
+version = "4.1.0"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.15"
+dependencies = [
+ { name = "docutils" },
+ { name = "markdown-it-py" },
+ { name = "mdformat" },
+ { name = "mdformat-gfm" },
+ { name = "packaging" },
+ { name = "pyyaml" },
+ { name = "towncrier" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "release_creator-4.1.0.tar.gz"
+upload-time = 2026-10-26 18:24:45.805437+00:00
+url = "https://files.pythonhosted.org/packages/7f/fd/05d7f3c604476a238d67d5aaa2a4085312e7078c193dbd7ad99ad48d560d/release_creator-4.1.0.tar.gz"
+size = 186016
+
+[packages.sdist.hashes]
+sha256 = "c783037f5ca2efc16fa7cccfb1c2abf0a442f116a63ca82bd7bfb7e2a8343a15"
+
+[[packages.wheels]]
+name = "release_creator-4.1.0-py3-none-any.whl"
+upload-time = 2026-10-26 18:24:44.353933+00:00
+url = "https://files.pythonhosted.org/packages/30/d0/38480e99025c021d07e0710af02547562dfadbd798bef26dc01869a3f81e/release_creator-4.1.0-py3-none-any.whl"
+size = 52922
+
+[packages.wheels.hashes]
+sha256 = "67deae16d11ac261a1512f18a22c0cf13418f43afc3e56cb74e58ad4422062e3"
+
+[[packages]]
+name = "requests"
+version = "2.34.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "certifi" },
+ { name = "charset-normalizer" },
+ { name = "idna" },
+ { name = "urllib3" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "requests-2.34.2.tar.gz"
+upload-time = 2026-05-14 19:25:27.735762+00:00
+url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz"
+size = 142856
+
+[packages.sdist.hashes]
+sha256 = "f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed"
+
+[[packages.wheels]]
+name = "requests-2.34.2-py3-none-any.whl"
+upload-time = 2026-05-14 19:25:26.443000+00:00
+url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl"
+size = 73075
+
+[packages.wheels.hashes]
+sha256 = "2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0"
+
+[[packages]]
+name = "requests-toolbelt"
+version = "1.0.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7"
+dependencies = [
+ { name = "requests" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "requests-toolbelt-1.0.0.tar.gz"
+upload-time = 2023-05-01 04:11:33.229998+00:00
+url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz"
+size = 206888
+
+[packages.sdist.hashes]
+sha256 = "7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"
+
+[[packages.wheels]]
+name = "requests_toolbelt-1.0.0-py2.py3-none-any.whl"
+upload-time = 2023-05-01 04:11:28.427086+00:00
+url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl"
+size = 54481
+
+[packages.wheels.hashes]
+sha256 = "cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"
+
+[[packages]]
+name = "rfc3986"
+version = "2.0.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.7"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "rfc3986-2.0.0.tar.gz"
+upload-time = 2022-01-10 00:52:30.832978+00:00
+url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz"
+size = 49026
+
+[packages.sdist.hashes]
+sha256 = "97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c"
+
+[[packages.wheels]]
+name = "rfc3986-2.0.0-py2.py3-none-any.whl"
+upload-time = 2022-01-10 00:52:29.594625+00:00
+url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl"
+size = 31326
+
+[packages.wheels.hashes]
+sha256 = "50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd"
+
+[[packages]]
+name = "rich"
+version = "15.0.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.9.0"
+dependencies = [
+ { name = "markdown-it-py" },
+ { name = "pygments" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "rich-15.0.0.tar.gz"
+upload-time = 2026-04-12 08:24:00.750018+00:00
+url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz"
+size = 230680
+
+[packages.sdist.hashes]
+sha256 = "edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36"
+
+[[packages.wheels]]
+name = "rich-15.0.0-py3-none-any.whl"
+upload-time = 2026-04-12 08:24:02.830783+00:00
+url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl"
+size = 310654
+
+[packages.wheels.hashes]
+sha256 = "33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb"
+
+[[packages]]
+name = "roman-numerals"
+version = "4.1.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "roman_numerals-4.1.0.tar.gz"
+upload-time = 2025-12-17 18:25:34.381818+00:00
+url = "https://files.pythonhosted.org/packages/ae/f9/41dc953bbeb056c17d5f7a519f50fdf010bd0553be2d630bc69d1e022703/roman_numerals-4.1.0.tar.gz"
+size = 9077
+
+[packages.sdist.hashes]
+sha256 = "1af8b147eb1405d5839e78aeb93131690495fe9da5c91856cb33ad55a7f1e5b2"
+
+[[packages.wheels]]
+name = "roman_numerals-4.1.0-py3-none-any.whl"
+upload-time = 2025-12-17 18:25:33.098993+00:00
+url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl"
+size = 7676
+
+[packages.wheels.hashes]
+sha256 = "647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7"
+
+[[packages]]
+name = "secretstorage"
+version = "3.5.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "cryptography" },
+ { name = "jeepney" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "secretstorage-3.5.0.tar.gz"
+upload-time = 2025-11-23 19:02:53.191898+00:00
+url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz"
+size = 19884
+
+[packages.sdist.hashes]
+sha256 = "f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be"
+
+[[packages.wheels]]
+name = "secretstorage-3.5.0-py3-none-any.whl"
+upload-time = 2025-11-23 19:02:51.545472+00:00
+url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl"
+size = 15554
+
+[packages.wheels.hashes]
+sha256 = "0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137"
+
+[[packages]]
+name = "setuptools"
+version = "84.0.0"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "setuptools-84.0.0.tar.gz"
+upload-time = 2026-08-08 18:27:58.365696+00:00
+url = "https://files.pythonhosted.org/packages/6d/44/f5da03a8ef95d369145c5bb53050e7877c9f3d312e128605fd9504829143/setuptools-84.0.0.tar.gz"
+size = 1168449
+
+[packages.sdist.hashes]
+sha256 = "f4695c21257f0d9b537ec2692c941d02ee143b7cc1276941349a546573b2ef73"
+
+[[packages.wheels]]
+name = "setuptools-84.0.0-py3-none-any.whl"
+upload-time = 2026-08-08 18:27:56.719708+00:00
+url = "https://files.pythonhosted.org/packages/95/9c/c510029fc6ef33a6275cd2c5d3cecd6613dfd6aa401d57c54f1c18852ccf/setuptools-84.0.0-py3-none-any.whl"
+size = 818216
+
+[packages.wheels.hashes]
+sha256 = "51a52592b3b99e102b609654876bd65f19f999935166d1352678931132b0c670"
+
+[[packages]]
+name = "setuptools-scm"
+version = "10.3.4"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.8"
+dependencies = [
+ { name = "packaging" },
+ { name = "setuptools" },
+ { name = "vcs-versioning" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "setuptools_scm-10.3.4.tar.gz"
+upload-time = 2026-09-23 19:21:42.950372+00:00
+url = "https://files.pythonhosted.org/packages/85/d8/fc143f88819ccf10ba2388ba86732ee2de193e578234e25a783f6cc14bf7/setuptools_scm-10.3.4.tar.gz"
+size = 78410
+
+[packages.sdist.hashes]
+sha256 = "a69f28bfc245608781205e912faae437c2b2165773afa4e7b979d77447a69dd2"
+
+[[packages.wheels]]
+name = "setuptools_scm-10.3.4-py3-none-any.whl"
+upload-time = 2026-09-23 19:21:41.607429+00:00
+url = "https://files.pythonhosted.org/packages/da/f5/54538a1f17ea753c42b0928dc2e62986d463f8c393340b9a1e602f2d4dd9/setuptools_scm-10.3.4-py3-none-any.whl"
+size = 33366
+
+[packages.wheels.hashes]
+sha256 = "82f34c3e3084fc2b57d397200637cc13f2338004052d2fee47baa5f0e902464e"
+
+[[packages]]
+name = "snowballstemmer"
+version = "3.1.1"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.3"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "snowballstemmer-3.1.1.tar.gz"
+upload-time = 2026-06-03 00:56:40.194915+00:00
+url = "https://files.pythonhosted.org/packages/43/f8/0a71edf031f03c40db17503cb8ca78a69a171254e568e7db241b0ab57ea1/snowballstemmer-3.1.1.tar.gz"
+size = 123314
+
+[packages.sdist.hashes]
+sha256 = "e07bbc54a0d798fe6010a12398422e62a8bfbba95c394fd0956ef58cb4d3e260"
+
+[[packages.wheels]]
+name = "snowballstemmer-3.1.1-py3-none-any.whl"
+upload-time = 2026-06-03 00:56:38.614300+00:00
+url = "https://files.pythonhosted.org/packages/4c/07/2ebca9b11fb9be7340a818d8d6f63feaebb146be2c4afbd6061701d6df6e/snowballstemmer-3.1.1-py3-none-any.whl"
+size = 104164
+
+[packages.wheels.hashes]
+sha256 = "7e207fa178741da09cdee59d3ecec3827ad5f92b1fc5c9ff3755b639f71f5752"
+
+[[packages]]
+name = "sphinx"
+version = "9.1.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.12"
+dependencies = [
+ { name = "alabaster" },
+ { name = "babel" },
+ { name = "docutils" },
+ { name = "imagesize" },
+ { name = "jinja2" },
+ { name = "packaging" },
+ { name = "pygments" },
+ { name = "requests" },
+ { name = "roman-numerals" },
+ { name = "snowballstemmer" },
+ { name = "sphinxcontrib-applehelp" },
+ { name = "sphinxcontrib-devhelp" },
+ { name = "sphinxcontrib-htmlhelp" },
+ { name = "sphinxcontrib-jsmath" },
+ { name = "sphinxcontrib-qthelp" },
+ { name = "sphinxcontrib-serializinghtml" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinx-9.1.0.tar.gz"
+upload-time = 2025-12-31 15:09:27.646696+00:00
+url = "https://files.pythonhosted.org/packages/cd/bd/f08eb0f4eed5c83f1ba2a3bd18f7745a2b1525fad70660a1c00224ec468a/sphinx-9.1.0.tar.gz"
+size = 8718324
+
+[packages.sdist.hashes]
+sha256 = "7741722357dd75f8190766926071fed3bdc211c74dd2d7d4df5404da95930ddb"
+
+[[packages.wheels]]
+name = "sphinx-9.1.0-py3-none-any.whl"
+upload-time = 2025-12-31 15:09:25.561651+00:00
+url = "https://files.pythonhosted.org/packages/73/f7/b1884cb3188ab181fc81fa00c266699dab600f927a964df02ec3d5d1916a/sphinx-9.1.0-py3-none-any.whl"
+size = 3921742
+
+[packages.wheels.hashes]
+sha256 = "c84fdd4e782504495fe4f2c0b3413d6c2bf388589bb352d439b2a3bb99991978"
+
+[[packages]]
+name = "sphinxcontrib-applehelp"
+version = "2.0.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib_applehelp-2.0.0.tar.gz"
+upload-time = 2024-07-29 01:09:00.465812+00:00
+url = "https://files.pythonhosted.org/packages/ba/6e/b837e84a1a704953c62ef8776d45c3e8d759876b4a84fe14eba2859106fe/sphinxcontrib_applehelp-2.0.0.tar.gz"
+size = 20053
+
+[packages.sdist.hashes]
+sha256 = "2f29ef331735ce958efa4734873f084941970894c6090408b079c61b2e1c06d1"
+
+[[packages.wheels]]
+name = "sphinxcontrib_applehelp-2.0.0-py3-none-any.whl"
+upload-time = 2024-07-29 01:08:58.990722+00:00
+url = "https://files.pythonhosted.org/packages/5d/85/9ebeae2f76e9e77b952f4b274c27238156eae7979c5421fba91a28f4970d/sphinxcontrib_applehelp-2.0.0-py3-none-any.whl"
+size = 119300
+
+[packages.wheels.hashes]
+sha256 = "4cd3f0ec4ac5dd9c17ec65e9ab272c9b867ea77425228e68ecf08d6b28ddbdb5"
+
+[[packages]]
+name = "sphinxcontrib-devhelp"
+version = "2.0.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib_devhelp-2.0.0.tar.gz"
+upload-time = 2024-07-29 01:09:23.417467+00:00
+url = "https://files.pythonhosted.org/packages/f6/d2/5beee64d3e4e747f316bae86b55943f51e82bb86ecd325883ef65741e7da/sphinxcontrib_devhelp-2.0.0.tar.gz"
+size = 12967
+
+[packages.sdist.hashes]
+sha256 = "411f5d96d445d1d73bb5d52133377b4248ec79db5c793ce7dbe59e074b4dd1ad"
+
+[[packages.wheels]]
+name = "sphinxcontrib_devhelp-2.0.0-py3-none-any.whl"
+upload-time = 2024-07-29 01:09:21.945229+00:00
+url = "https://files.pythonhosted.org/packages/35/7a/987e583882f985fe4d7323774889ec58049171828b58c2217e7f79cdf44e/sphinxcontrib_devhelp-2.0.0-py3-none-any.whl"
+size = 82530
+
+[packages.wheels.hashes]
+sha256 = "aefb8b83854e4b0998877524d1029fd3e6879210422ee3780459e28a1f03a8a2"
+
+[[packages]]
+name = "sphinxcontrib-htmlhelp"
+version = "2.1.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib_htmlhelp-2.1.0.tar.gz"
+upload-time = 2024-07-29 01:09:37.889318+00:00
+url = "https://files.pythonhosted.org/packages/43/93/983afd9aa001e5201eab16b5a444ed5b9b0a7a010541e0ddfbbfd0b2470c/sphinxcontrib_htmlhelp-2.1.0.tar.gz"
+size = 22617
+
+[packages.sdist.hashes]
+sha256 = "c9e2916ace8aad64cc13a0d233ee22317f2b9025b9cf3295249fa985cc7082e9"
+
+[[packages.wheels]]
+name = "sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl"
+upload-time = 2024-07-29 01:09:36.407072+00:00
+url = "https://files.pythonhosted.org/packages/0a/7b/18a8c0bcec9182c05a0b3ec2a776bba4ead82750a55ff798e8d406dae604/sphinxcontrib_htmlhelp-2.1.0-py3-none-any.whl"
+size = 98705
+
+[packages.wheels.hashes]
+sha256 = "166759820b47002d22914d64a075ce08f4c46818e17cfc9470a9786b759b19f8"
+
+[[packages]]
+name = "sphinxcontrib-jsmath"
+version = "1.0.1"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.5"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib-jsmath-1.0.1.tar.gz"
+upload-time = 2019-01-21 16:10:16.347697+00:00
+url = "https://files.pythonhosted.org/packages/b2/e8/9ed3830aeed71f17c026a07a5097edcf44b692850ef215b161b8ad875729/sphinxcontrib-jsmath-1.0.1.tar.gz"
+size = 5787
+
+[packages.sdist.hashes]
+sha256 = "a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"
+
+[[packages.wheels]]
+name = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl"
+upload-time = 2019-01-21 16:10:14.333769+00:00
+url = "https://files.pythonhosted.org/packages/c2/42/4c8646762ee83602e3fb3fbe774c2fac12f317deb0b5dbeeedd2d3ba4b77/sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl"
+size = 5071
+
+[packages.wheels.hashes]
+sha256 = "2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"
+
+[[packages]]
+name = "sphinxcontrib-qthelp"
+version = "2.0.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib_qthelp-2.0.0.tar.gz"
+upload-time = 2024-07-29 01:09:56.435212+00:00
+url = "https://files.pythonhosted.org/packages/68/bc/9104308fc285eb3e0b31b67688235db556cd5b0ef31d96f30e45f2e51cae/sphinxcontrib_qthelp-2.0.0.tar.gz"
+size = 17165
+
+[packages.sdist.hashes]
+sha256 = "4fe7d0ac8fc171045be623aba3e2a8f613f8682731f9153bb2e40ece16b9bbab"
+
+[[packages.wheels]]
+name = "sphinxcontrib_qthelp-2.0.0-py3-none-any.whl"
+upload-time = 2024-07-29 01:09:54.885300+00:00
+url = "https://files.pythonhosted.org/packages/27/83/859ecdd180cacc13b1f7e857abf8582a64552ea7a061057a6c716e790fce/sphinxcontrib_qthelp-2.0.0-py3-none-any.whl"
+size = 88743
+
+[packages.wheels.hashes]
+sha256 = "b18a828cdba941ccd6ee8445dbe72ffa3ef8cbe7505d8cd1fa0d42d3f2d5f3eb"
+
+[[packages]]
+name = "sphinxcontrib-serializinghtml"
+version = "2.0.0"
+marker = "\"project-runtime\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "sphinxcontrib_serializinghtml-2.0.0.tar.gz"
+upload-time = 2024-07-29 01:10:09.332393+00:00
+url = "https://files.pythonhosted.org/packages/3b/44/6716b257b0aa6bfd51a1b31665d1c205fb12cb5ad56de752dfa15657de2f/sphinxcontrib_serializinghtml-2.0.0.tar.gz"
+size = 16080
+
+[packages.sdist.hashes]
+sha256 = "e9d912827f872c029017a53f0ef2180b327c3f7fd23c87229f7a8e8b70031d4d"
+
+[[packages.wheels]]
+name = "sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl"
+upload-time = 2024-07-29 01:10:08.203690+00:00
+url = "https://files.pythonhosted.org/packages/52/a7/d2782e4e3f77c8450f727ba74a8f12756d5ba823d81b941f1b04da9d033a/sphinxcontrib_serializinghtml-2.0.0-py3-none-any.whl"
+size = 92072
+
+[packages.wheels.hashes]
+sha256 = "6e2cb0eef194e10c27ec0023bfeb25badbbb5868244cf5bc5bdc04e4464bf331"
+
+[[packages]]
+name = "tomlkit"
+version = "0.15.2"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "tomlkit-0.15.2.tar.gz"
+upload-time = 2026-10-16 04:07:08.166827+00:00
+url = "https://files.pythonhosted.org/packages/08/72/fc01563df95c189a9f65850096bdc205bc2fe37da6c740cd64afaf18d07e/tomlkit-0.15.2.tar.gz"
+size = 190522
+
+[packages.sdist.hashes]
+sha256 = "83e32755ba1d20d9340bd069ee97e9f6232ba2346b63ffcba425de01f7e327a6"
+
+[[packages.wheels]]
+name = "tomlkit-0.15.2-py3-none-any.whl"
+upload-time = 2026-10-16 04:07:09.216014+00:00
+url = "https://files.pythonhosted.org/packages/da/46/7d84138a60a8bd796825b2d38ebe92d0d16501ca57d501b7c5d677401bbc/tomlkit-0.15.2-py3-none-any.whl"
+size = 52225
+
+[packages.wheels.hashes]
+sha256 = "05562412163a3037b94497385fb7f9204c637bc605af7a48199e41cf2272f437"
+
+[[packages]]
+name = "towncrier"
+version = "26.9.0"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "click" },
+ { name = "jinja2" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "towncrier-26.9.0.tar.gz"
+upload-time = 2026-09-04 12:57:25.341701+00:00
+url = "https://files.pythonhosted.org/packages/92/d4/e85ce614bf45b1a7fe13b82cc687819c2eaac5a1dd94b84834322095fd98/towncrier-26.9.0.tar.gz"
+size = 79338
+
+[packages.sdist.hashes]
+sha256 = "ace9031631c718cc0709107b8755e6e31350eb8acdc877af43df3177addb9a55"
+
+[[packages.wheels]]
+name = "towncrier-26.9.0-py3-none-any.whl"
+upload-time = 2026-09-04 12:57:23.986160+00:00
+url = "https://files.pythonhosted.org/packages/82/88/f9340b545dafa64de053798e760515a2736fbb60092cf9aa6b146ccf3ede/towncrier-26.9.0-py3-none-any.whl"
+size = 67030
+
+[packages.wheels.hashes]
+sha256 = "ae4d223e6aadaff98d29b7f09e58d9c9ccf4cd3b455a2d2e0486d432cd8bf660"
+
+[[packages]]
+name = "trove-classifiers"
+version = "2026.9.21.13"
+marker = "\"build\" in dependency_groups"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "trove_classifiers-2026.9.21.13.tar.gz"
+upload-time = 2026-09-21 13:29:07.301512+00:00
+url = "https://files.pythonhosted.org/packages/bf/93/af436dfaa845cab5d96f0adbc1e4f3730532d37fa249e4eb796fb1d7fc82/trove_classifiers-2026.9.21.13.tar.gz"
+size = 17085
+
+[packages.sdist.hashes]
+sha256 = "0a9ebc8d4e2f3e8a22848c5258033035bec17a3012ac3fea16dbaa764489eb71"
+
+[[packages.wheels]]
+name = "trove_classifiers-2026.9.21.13-py3-none-any.whl"
+upload-time = 2026-09-21 13:29:06.123578+00:00
+url = "https://files.pythonhosted.org/packages/30/81/0da8afb52a71d0a4f2bd3152357b1a441e393b286374802b9d3addab4ab5/trove_classifiers-2026.9.21.13-py3-none-any.whl"
+size = 14232
+
+[packages.wheels.hashes]
+sha256 = "8b1ff4f9c191b1040b71c37f1e445ab99732911e3cd91de52838453a854d7a17"
+
+[[packages]]
+name = "twine"
+version = "7.0.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "id" },
+ { name = "keyring" },
+ { name = "packaging" },
+ { name = "readme-renderer" },
+ { name = "requests" },
+ { name = "requests-toolbelt" },
+ { name = "rfc3986" },
+ { name = "rich" },
+ { name = "urllib3" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "twine-7.0.0.tar.gz"
+upload-time = 2026-07-27 15:59:00.825945+00:00
+url = "https://files.pythonhosted.org/packages/92/3c/58f808a359700f39a967dffede33efeac809262c03303fa3eec6afff8f49/twine-7.0.0.tar.gz"
+size = 215032
+
+[packages.sdist.hashes]
+sha256 = "85cdb29c518efef867360ae4acd4b0dfd61c8654a22fca08e6f8539f05022177"
+
+[[packages.wheels]]
+name = "twine-7.0.0-py3-none-any.whl"
+upload-time = 2026-07-27 15:58:59.260418+00:00
+url = "https://files.pythonhosted.org/packages/96/08/ddcdc06225eaad6de0e48e1002b06d919dbde20582d0662c7af51308e5d6/twine-7.0.0-py3-none-any.whl"
+size = 43204
+
+[packages.wheels.hashes]
+sha256 = "b854164df26db268af05f49aa5c0344b10e27a494343ff05b1e0bad3b135f5a7"
+
+[[packages]]
+name = "ty"
+version = "0.0.24"
+marker = "\"dev\" in dependency_groups or \"type\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "ty-0.0.24.tar.gz"
+upload-time = 2026-03-19 16:55:57.035735+00:00
+url = "https://files.pythonhosted.org/packages/7a/96/652a425030f95dc2c9548d9019e52502e17079e1daeefbc4036f1c0905b4/ty-0.0.24.tar.gz"
+size = 5354286
+
+[packages.sdist.hashes]
+sha256 = "9fe42f6b98207bdaef51f71487d6d087f2cb02555ee3939884d779b2b3cc8bfc"
+
+[[packages.wheels]]
+name = "ty-0.0.24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+upload-time = 2026-03-19 16:55:25.728260+00:00
+url = "https://files.pythonhosted.org/packages/ac/f1/32c05a1c4c3c2a95c5b7361dee03a9bf1231d4ad096b161c838b45bce5a0/ty-0.0.24-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+size = 10791455
+
+[packages.wheels.hashes]
+sha256 = "7981df5c709c054da4ac5d7c93f8feb8f45e69e829e4461df4d5f0988fe67d04"
+
+[[packages]]
+name = "typing-extensions"
+version = "4.16.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "typing_extensions-4.16.0.tar.gz"
+upload-time = 2026-07-02 08:40:05.920538+00:00
+url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz"
+size = 113555
+
+[packages.sdist.hashes]
+sha256 = "dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"
+
+[[packages.wheels]]
+name = "typing_extensions-4.16.0-py3-none-any.whl"
+upload-time = 2026-07-02 08:40:04.659120+00:00
+url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl"
+size = 45571
+
+[packages.wheels.hashes]
+sha256 = "481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8"
+
+[[packages]]
+name = "typing-inspection"
+version = "0.4.4"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.10"
+dependencies = [
+ { name = "typing-extensions" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "typing_inspection-0.4.4.tar.gz"
+upload-time = 2026-08-12 12:37:25.997329+00:00
+url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c09092e6b34058f36a460eea2d4c3e8b910c695975a0/typing_inspection-0.4.4.tar.gz"
+size = 76928
+
+[packages.sdist.hashes]
+sha256 = "547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47"
+
+[[packages.wheels]]
+name = "typing_inspection-0.4.4-py3-none-any.whl"
+upload-time = 2026-08-12 12:37:24.648475+00:00
+url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl"
+size = 14750
+
+[packages.wheels.hashes]
+sha256 = "65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147"
+
+[[packages]]
+name = "urllib3"
+version = "2.8.0"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups or \"project-runtime\" in dependency_groups"
+requires-python = ">=3.10"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "urllib3-2.8.0.tar.gz"
+upload-time = 2026-09-15 19:29:36.253420+00:00
+url = "https://files.pythonhosted.org/packages/e3/05/b17359e1cefb4f909b5e40b1b90a496d987258916dbbf88e842c729f510e/urllib3-2.8.0.tar.gz"
+size = 458972
+
+[packages.sdist.hashes]
+sha256 = "63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63"
+
+[[packages.wheels]]
+name = "urllib3-2.8.0-py3-none-any.whl"
+upload-time = 2026-09-15 19:29:34.577402+00:00
+url = "https://files.pythonhosted.org/packages/92/9d/c4e665119135114480843e7ab388fa94d8480650450e6f8e26b70d323a4c/urllib3-2.8.0-py3-none-any.whl"
+size = 135717
+
+[packages.wheels.hashes]
+sha256 = "0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3"
+
+[[packages]]
+name = "uv"
+version = "0.13.1"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "uv-0.13.1.tar.gz"
+upload-time = 2026-10-14 05:13:35.353145+00:00
+url = "https://files.pythonhosted.org/packages/ef/10/81f499de381ac81e09961e1c19255c5cf49563ac418464def4190b6c7400/uv-0.13.1.tar.gz"
+size = 7434239
+
+[packages.sdist.hashes]
+sha256 = "6df50a86b09be66a413f8f1b16258d585d4dd1cbff591077ae1e6f65c26de2eb"
+
+[[packages.wheels]]
+name = "uv-0.13.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+upload-time = 2026-10-14 05:13:13.069021+00:00
+url = "https://files.pythonhosted.org/packages/14/0b/6602a613533602e7a083e908c4375f9b0e78a94ba2e21c29b21c41a0a611/uv-0.13.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl"
+size = 17279385
+
+[packages.wheels.hashes]
+sha256 = "696dcf6d807d85da978f4db8472da81dccc1254b18b52cbd1367c4d923c421e0"
+
+[[packages]]
+name = "vcs-versioning"
+version = "2.6.0"
+marker = "\"build\" in dependency_groups"
+requires-python = ">=3.8"
+dependencies = [
+ { name = "packaging" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "vcs_versioning-2.6.0.tar.gz"
+upload-time = 2026-10-06 22:21:55.024903+00:00
+url = "https://files.pythonhosted.org/packages/ad/e7/2a691db7d076b75d099fdba1a14cd966931f2aeb591e77f6d22f15097326/vcs_versioning-2.6.0.tar.gz"
+size = 166800
+
+[packages.sdist.hashes]
+sha256 = "22e9159288e2d8bca2fa6f6c31c34c9c66aec157f60e9e526f5d160d2516d60f"
+
+[[packages.wheels]]
+name = "vcs_versioning-2.6.0-py3-none-any.whl"
+upload-time = 2026-10-06 22:21:53.267565+00:00
+url = "https://files.pythonhosted.org/packages/73/1d/ad4064bf12f4503bf61e65d74c93c523672776d25ee0a06aaf42ae09ef3f/vcs_versioning-2.6.0-py3-none-any.whl"
+size = 123154
+
+[packages.wheels.hashes]
+sha256 = "f8bebd1302ebc12e67ceb30fc7dd698ec969414b6fa43b30c3f14ac9b1e72c41"
+
+[[packages]]
+name = "virtualenv"
+version = "21.14.11"
+marker = "\"dev\" in dependency_groups or \"lint\" in dependency_groups"
+requires-python = ">=3.9"
+dependencies = [
+ { name = "distlib" },
+ { name = "filelock" },
+ { name = "packaging" },
+ { name = "platformdirs" },
+ { name = "python-discovery" },
+]
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "virtualenv-21.14.11.tar.gz"
+upload-time = 2026-10-18 07:06:34.716606+00:00
+url = "https://files.pythonhosted.org/packages/7f/be/4d1d59d309db76b5808fcfd78bd5996f4e7241366691c38fc331a3136398/virtualenv-21.14.11.tar.gz"
+size = 5503091
+
+[packages.sdist.hashes]
+sha256 = "593052d8477ea8c55a842387ce111bd08c72618f0c1133c302cafe335e570a57"
+
+[[packages.wheels]]
+name = "virtualenv-21.14.11-py3-none-any.whl"
+upload-time = 2026-10-18 07:06:32.719110+00:00
+url = "https://files.pythonhosted.org/packages/ce/6b/d85da8982b41190eafcb9df91dff9d83fc6989e98af4b5be4c8f85510c95/virtualenv-21.14.11-py3-none-any.whl"
+size = 5495268
+
+[packages.wheels.hashes]
+sha256 = "b319f8590a84e5de5f8f2c803ecd2237e9bc0ffa7c1e875e3169c107cecb7454"
+
+[[packages]]
+name = "wcwidth"
+version = "0.9.2"
+marker = "\"release-news\" in dependency_groups or \"release-notes\" in dependency_groups or \"release-prepare\" in dependency_groups"
+requires-python = ">=3.9"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "wcwidth-0.9.2.tar.gz"
+upload-time = 2026-10-05 00:24:05.521972+00:00
+url = "https://files.pythonhosted.org/packages/f0/b4/7830542634bb2d3e62aa3b586a72d5b3b6c91c3168929e7000ef3fed041d/wcwidth-0.9.2.tar.gz"
+size = 955039
+
+[packages.sdist.hashes]
+sha256 = "ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b"
+
+[[packages.wheels]]
+name = "wcwidth-0.9.2-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+upload-time = 2026-10-05 00:23:40.175985+00:00
+url = "https://files.pythonhosted.org/packages/db/6c/f940133c71427c208575910e981942bd78c98b1f7cd0d1425ca4b7457c04/wcwidth-0.9.2-cp310-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl"
+size = 769763
+
+[packages.wheels.hashes]
+sha256 = "751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389"
+
+[[packages.wheels]]
+name = "wcwidth-0.9.2-py3-none-any.whl"
+upload-time = 2026-10-05 00:23:21.097514+00:00
+url = "https://files.pythonhosted.org/packages/9c/b4/0bfa065af506540d9d558e3e5548cff00bc1f9b24e6e2a8512498e8628de/wcwidth-0.9.2-py3-none-any.whl"
+size = 301667
+
+[packages.wheels.hashes]
+sha256 = "89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e"
+
+[[packages]]
+name = "wheel-filename"
+version = "1.4.2"
+marker = "\"dev\" in dependency_groups or \"pkg-meta\" in dependency_groups"
+requires-python = ">=3.8"
+index = "https://pypi.org/simple/"
+
+[packages.sdist]
+name = "wheel_filename-1.4.2.tar.gz"
+upload-time = 2024-12-01 13:03:16.012739+00:00
+url = "https://files.pythonhosted.org/packages/38/be/726dab762b770d0417e505c58e26d661aac1ec0c831e483cda4817ca2417/wheel_filename-1.4.2.tar.gz"
+size = 7911
+
+[packages.sdist.hashes]
+sha256 = "87891c465dcbb40b40394a906f01a93214bdd51aa5d25e3a9a59cae62bc298fd"
+
+[[packages.wheels]]
+name = "wheel_filename-1.4.2-py3-none-any.whl"
+upload-time = 2024-12-01 13:03:00.536117+00:00
+url = "https://files.pythonhosted.org/packages/b4/0f/6e97a3bc38cdde32e3ec49f8c0903fe3559ec9ec9db181782f0bb4417717/wheel_filename-1.4.2-py3-none-any.whl"
+size = 6195
+
+[packages.wheels.hashes]
+sha256 = "3fa599046443d4ca830d06e3d180cd0a675d5871af0a68daa5623318bb4d17e3"
+
+[tool.nab]
+nab-version = "0.0.22"
+created-at = 2026-10-26 20:07:36.634305+00:00
+command-line = [
+ "nab",
+ "lock",
+ "--all-groups",
+ "--all-extras",
+ "--no-cache",
+ "--upgrade",
+ "pyproject.toml",
+ "--output",
+ "pylock.toml",
+]
+input-path = "pyproject.toml"
+mode = "universal"
+python-specifier = ">=3.15,<3.16"
+platforms = [
+ "linux_x86_64",
+]
diff --git a/pyproject.toml b/pyproject.toml
index 61a81c9..c2debd9 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,14 +1,15 @@
[build-system]
build-backend = "hatchling.build"
requires = [
+ "hatch-fancy-pypi-readme>=25.1",
"hatch-vcs>=0.5",
"hatchling>=1.32.4",
]
[project]
name = "sphinx-argparse-cli"
+import-names = [ "sphinx_argparse_cli" ]
description = "render CLI arguments (sub-commands friendly) defined by argparse module"
-readme = "README.md"
keywords = [
"argparse",
"sphinx",
@@ -24,7 +25,6 @@ classifiers = [
"Framework :: Sphinx",
"Framework :: Sphinx :: Extension",
"Intended Audience :: Developers",
- "License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3 :: Only",
"Programming Language :: Python :: 3.11",
@@ -37,11 +37,13 @@ classifiers = [
"Topic :: Documentation :: Sphinx",
]
dynamic = [
+ "readme",
"version",
]
dependencies = [
"sphinx>=9.0.4",
]
+urls.Changelog = "https://github.com/tox-dev/sphinx-argparse-cli/blob/main/CHANGELOG.md"
urls.Documentation = "https://github.com/tox-dev/sphinx-argparse-cli#sphinx-argparse-cli"
urls.Homepage = "https://github.com/tox-dev/sphinx-argparse-cli"
urls.Source = "https://github.com/tox-dev/sphinx-argparse-cli"
@@ -64,6 +66,13 @@ type = [
"ty<0.0.25,>=0.0.24",
{ include-group = "test" },
]
+build = [
+ "cython>=3",
+ "hatch-fancy-pypi-readme>=25.1",
+ "hatch-vcs>=0.5",
+ "hatchling>=1.32.4",
+ "setuptools>=80",
+]
lint = [
"pre-commit-uv>=4.3",
]
@@ -72,15 +81,41 @@ pkg-meta = [
"twine>=7",
"uv>=0.12.22",
]
+release-news = [
+ "release-creator>=4.1",
+ "towncrier>=26.9",
+]
+release-notes = [
+ "release-creator>=4.1",
+]
+release-prepare = [
+ "prek>=0.5",
+ "release-creator>=4.1",
+ "towncrier>=26.9",
+]
[tool.hatch]
version.source = "vcs"
+metadata.hooks.fancy-pypi-readme.content-type = "text/markdown"
+metadata.hooks.fancy-pypi-readme.fragments = [ { path = "README.md" } ]
+metadata.hooks.fancy-pypi-readme.substitutions = [
+ { pattern = '''(?x)
+ (?[^\]]+)\]\( # Link text, excluding images
+ (?PCHANGELOG\.md|CONTRIBUTING\.md) # Repository files linked from the README
+ \)
+ ''', replacement = '[\g