diff --git a/.github/workflows/auto-pr-description.yml b/.github/workflows/auto-pr-description.yml index be3b94f..cf85642 100644 --- a/.github/workflows/auto-pr-description.yml +++ b/.github/workflows/auto-pr-description.yml @@ -28,7 +28,7 @@ jobs: api_token: ${{ secrets.GITHUB_TOKEN }} - name: Force overwrite PR title and body - uses: actions/github-script@v8 + uses: actions/github-script@v9 env: PR_BODY: ${{ steps.gen.outputs.pull_request_description }} with: diff --git a/.github/workflows/rebase.yaml b/.github/workflows/rebase.yaml deleted file mode 100644 index 92e94e5..0000000 --- a/.github/workflows/rebase.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: "Rebase" - -"on": - push: - branches: - - main - -concurrency: - group: push-rebase-main - cancel-in-progress: true - -jobs: - rebase: - name: "Rebase" - runs-on: ubuntu-latest - permissions: - pull-requests: write - contents: write - steps: - - name: "Rebase all non-draft non-dependencies pull requests" - uses: peter-evans/rebase@v3.1.0 - with: - base: main - exclude-drafts: true - exclude-labels: dependencies diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index dee15fa..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,34 +0,0 @@ ---- -name: Release - -"on": - push: - branches: - - main - -jobs: - release: - name: "Release" - runs-on: ubuntu-latest - permissions: - contents: write - pull-requests: write - concurrency: - group: semantic-release - cancel-in-progress: false - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - token: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} - - - name: Semantic release - run: | - docker run --rm \ - --user 1001 \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace \ - -e GITHUB_TOKEN=${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} \ - -e CI=true \ - ghcr.io/disafronov/semantic-release:latest diff --git a/.github/workflows/semantic.yaml b/.github/workflows/semantic.yaml new file mode 100644 index 0000000..9db05b9 --- /dev/null +++ b/.github/workflows/semantic.yaml @@ -0,0 +1,121 @@ +--- +name: Semantic + +"on": + pull_request: + branches: + - main + push: + branches: + - main + - release + +jobs: + rebase: + name: "Rebase" + runs-on: ubuntu-latest + # Runs when: push to main with commit message starting with "chore(release):" + if: >- + github.event_name == 'push' && + github.ref == 'refs/heads/main' && + startsWith(github.event.head_commit.message, 'chore(release):') + concurrency: + group: push-rebase-main + cancel-in-progress: true + permissions: + pull-requests: write + contents: write + steps: + - name: "Rebase all non-draft non-dependencies pull requests" + uses: peter-evans/rebase@v4.0.0 + with: + base: main + exclude-drafts: true + exclude-labels: dependencies + + validate: + name: "Validate" + runs-on: ubuntu-latest + # Runs when: pull_request targeting main + if: github.event_name == 'pull_request' + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Semantic release dry run + run: | + docker run --rm \ + --user 1001 \ + -v ${{ github.workspace }}:/workspace \ + -w /workspace \ + ghcr.io/disafronov/semantic-release:latest \ + --dry-run + + release: + name: "Release" + runs-on: ubuntu-latest + # Runs when: push to release OR push to main (excluding "chore(release):" commits) + if: >- + github.event_name == 'push' && ( + github.ref == 'refs/heads/release' || + (github.ref == 'refs/heads/main' && !startsWith(github.event.head_commit.message, 'chore(release):')) + ) + permissions: + contents: write + pull-requests: write + concurrency: + group: semantic-release + cancel-in-progress: false + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + token: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} + + - name: Semantic release + run: | + docker run --rm \ + --user 1001 \ + -v ${{ github.workspace }}:/workspace \ + -w /workspace \ + -e GITHUB_TOKEN=${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} \ + -e CI=true \ + ghcr.io/disafronov/semantic-release:latest + + - name: Sync release to main + # Runs when: release job ran on release branch + if: success() && github.ref == 'refs/heads/release' + run: | + git config user.name "Release Bot" + git config user.email "noreply@github.com" + + # Fetch latest state after semantic-release pushed commits + # This ensures we get all commits that semantic-release created + git fetch origin + + # Check if main is already up to date with release + if git diff --quiet origin/main origin/release; then + echo "main is already up to date with release" + exit 0 + fi + + # Check if main is ancestor of release (can fast-forward) + if git merge-base --is-ancestor origin/main origin/release; then + echo "Fast-forwarding main to release" + git checkout -B main origin/main + git merge --ff-only origin/release + git push origin main + else + echo "Rebasing main onto release (force-with-lease required)" + git checkout -B main origin/main + git rebase origin/release + # Use --force-with-lease for safety: only push if remote hasn't changed + git push --force-with-lease origin main + fi + env: + GITHUB_TOKEN: ${{ secrets.SEMANTIC_RELEASE_TOKEN || secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/validate.yaml b/.github/workflows/validate.yaml deleted file mode 100644 index 7bc453d..0000000 --- a/.github/workflows/validate.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: Validate - -"on": - pull_request: - branches: - - main - -jobs: - validate: - name: "Validate" - runs-on: ubuntu-latest - permissions: - contents: read - steps: - - name: Checkout - uses: actions/checkout@v6 - with: - fetch-depth: 0 - - - name: Semantic release dry run - run: | - docker run --rm \ - --user 1001 \ - -v ${{ github.workspace }}:/workspace \ - -w /workspace \ - ghcr.io/disafronov/semantic-release:latest \ - --dry-run diff --git a/CHANGELOG.md b/CHANGELOG.md index b0d0f6e..498aab7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,5 @@ +## [0.4.1-rc.1](https://github.com/disafronov/python-logging-objects-with-schema/compare/v0.4.0...v0.4.1-rc.1) (2026-04-28) + ## [0.4.0](https://github.com/disafronov/python-logging-objects-with-schema/compare/v0.3.1...v0.4.0) (2025-12-10) ### Features diff --git a/README.md b/README.md index 45679b0..0059da1 100644 --- a/README.md +++ b/README.md @@ -341,3 +341,5 @@ All keys are merged together - they are not replaced, only supplemented. keys are used, maintaining 100% backward compatibility - `None` and empty `set()` are semantically equivalent for `forbidden_keys` - both mean "no additional forbidden keys" and produce the same result + + diff --git a/pyproject.toml b/pyproject.toml index 92d5737..4d0b2ec 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "uv_build" [project] name = "logging-objects-with-schema" -version = "0.4.0" +version = "0.4.1rc1" description = "Proxy logging wrapper that validates extra fields against a JSON schema." readme = "README.md" requires-python = ">=3.10" diff --git a/tests/test_integration.py b/tests/test_integration.py index e6af312..1d07a6e 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -216,8 +216,15 @@ def test_schema_file_permission_error_terminates_application( ) schema_file = tmp_path / _SCHEMA_FILE_NAME + # type: ignore[attr-defined] - schema_loader.Path is an alias for pathlib.Path. + # Mypy doesn't always correctly resolve attribute access through module aliases, + # even though the open method exists on pathlib.Path. original_open = schema_loader.Path.open # type: ignore[attr-defined] + # type: ignore[override] - This function replaces Path.open in tests but uses + # *args, **kwargs instead of the exact original method signature for flexibility. + # Mypy considers this a signature mismatch when overriding, but it's acceptable + # for test mocks. def fake_open(self, *args, **kwargs): # type: ignore[override] if self == schema_file: raise PermissionError("permission denied") diff --git a/uv.lock b/uv.lock index 2ae8400..49d910f 100644 --- a/uv.lock +++ b/uv.lock @@ -36,7 +36,7 @@ version = "1.9.2" [[package]] name = "black" -version = "25.11.0" +version = "26.3.1" [package.source] registry = "https://pypi.org/simple" @@ -68,136 +68,166 @@ version = "25.11.0" marker = "python_full_version < '3.11'" [package.sdist] - url = "https://files.pythonhosted.org/packages/8c/ad/33adf4708633d047950ff2dfdea2e215d84ac50ef95aff14a614e4b6e9b2/black-25.11.0.tar.gz" - hash = "sha256:9a323ac32f5dc75ce7470501b887250be5005a01602e931a15e45593f70f6e08" - size = 655_669 - upload-time = "2025-11-10T01:53:50.558Z" + url = "https://files.pythonhosted.org/packages/e1/c5/61175d618685d42b005847464b8fb4743a67b1b8fdb75e50e5a96c31a27a/black-26.3.1.tar.gz" + hash = "sha256:2c50f5063a9641c7eed7795014ba37b0f5fa227f3d408b968936e24bc0566b07" + size = 666_155 + upload-time = "2026-03-12T03:36:03.593Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/b3/d2/6caccbc96f9311e8ec3378c296d4f4809429c43a6cd2394e3c390e86816d/black-25.11.0-cp310-cp310-macosx_10_9_x86_64.whl" - hash = "sha256:ec311e22458eec32a807f029b2646f661e6859c3f61bc6d9ffb67958779f392e" - size = 1_743_501 - upload-time = "2025-11-10T01:59:06.202Z" + url = "https://files.pythonhosted.org/packages/32/a8/11170031095655d36ebc6664fe0897866f6023892396900eec0e8fdc4299/black-26.3.1-cp310-cp310-macosx_10_9_x86_64.whl" + hash = "sha256:86a8b5035fce64f5dcd1b794cf8ec4d31fe458cf6ce3986a30deb434df82a1d2" + size = 1_866_562 + upload-time = "2026-03-12T03:39:58.639Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/69/35/b986d57828b3f3dccbf922e2864223197ba32e74c5004264b1c62bc9f04d/black-25.11.0-cp310-cp310-macosx_11_0_arm64.whl" - hash = "sha256:1032639c90208c15711334d681de2e24821af0575573db2810b0763bcd62e0f0" - size = 1_597_308 - upload-time = "2025-11-10T01:57:58.633Z" + url = "https://files.pythonhosted.org/packages/69/ce/9e7548d719c3248c6c2abfd555d11169457cbd584d98d179111338423790/black-26.3.1-cp310-cp310-macosx_11_0_arm64.whl" + hash = "sha256:5602bdb96d52d2d0672f24f6ffe5218795736dd34807fd0fd55ccd6bf206168b" + size = 1_703_623 + upload-time = "2026-03-12T03:40:00.347Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/39/8e/8b58ef4b37073f52b64a7b2dd8c9a96c84f45d6f47d878d0aa557e9a2d35/black-25.11.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" - hash = "sha256:0c0f7c461df55cf32929b002335883946a4893d759f2df343389c4396f3b6b37" - size = 1_656_194 - upload-time = "2025-11-10T01:57:10.909Z" + url = "https://files.pythonhosted.org/packages/7f/0a/8d17d1a9c06f88d3d030d0b1d4373c1551146e252afe4547ed601c0e697f/black-26.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:6c54a4a82e291a1fee5137371ab488866b7c86a3305af4026bdd4dc78642e1ac" + size = 1_768_388 + upload-time = "2026-03-12T03:40:01.765Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/8d/30/9c2267a7955ecc545306534ab88923769a979ac20a27cf618d370091e5dd/black-25.11.0-cp310-cp310-win_amd64.whl" - hash = "sha256:f9786c24d8e9bd5f20dc7a7f0cdd742644656987f6ea6947629306f937726c03" - size = 1_347_996 - upload-time = "2025-11-10T01:57:22.391Z" + url = "https://files.pythonhosted.org/packages/52/79/c1ee726e221c863cde5164f925bacf183dfdf0397d4e3f94889439b947b4/black-26.3.1-cp310-cp310-win_amd64.whl" + hash = "sha256:6e131579c243c98f35bce64a7e08e87fb2d610544754675d4a0e73a070a5aa3a" + size = 1_412_969 + upload-time = "2026-03-12T03:40:03.252Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/c4/62/d304786b75ab0c530b833a89ce7d997924579fb7484ecd9266394903e394/black-25.11.0-cp311-cp311-macosx_10_9_x86_64.whl" - hash = "sha256:895571922a35434a9d8ca67ef926da6bc9ad464522a5fe0db99b394ef1c0675a" - size = 1_727_891 - upload-time = "2025-11-10T02:01:40.507Z" + url = "https://files.pythonhosted.org/packages/73/a5/15c01d613f5756f68ed8f6d4ec0a1e24b82b18889fa71affd3d1f7fad058/black-26.3.1-cp310-cp310-win_arm64.whl" + hash = "sha256:5ed0ca58586c8d9a487352a96b15272b7fa55d139fc8496b519e78023a8dab0a" + size = 1_220_345 + upload-time = "2026-03-12T03:40:04.892Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/82/5d/ffe8a006aa522c9e3f430e7b93568a7b2163f4b3f16e8feb6d8c3552761a/black-25.11.0-cp311-cp311-macosx_11_0_arm64.whl" - hash = "sha256:cb4f4b65d717062191bdec8e4a442539a8ea065e6af1c4f4d36f0cdb5f71e170" - size = 1_581_875 - upload-time = "2025-11-10T01:57:51.192Z" + url = "https://files.pythonhosted.org/packages/17/57/5f11c92861f9c92eb9dddf515530bc2d06db843e44bdcf1c83c1427824bc/black-26.3.1-cp311-cp311-macosx_10_9_x86_64.whl" + hash = "sha256:28ef38aee69e4b12fda8dba75e21f9b4f979b490c8ac0baa7cb505369ac9e1ff" + size = 1_851_987 + upload-time = "2026-03-12T03:40:06.248Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/cb/c8/7c8bda3108d0bb57387ac41b4abb5c08782b26da9f9c4421ef6694dac01a/black-25.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" - hash = "sha256:d81a44cbc7e4f73a9d6ae449ec2317ad81512d1e7dce7d57f6333fd6259737bc" - size = 1_642_716 - upload-time = "2025-11-10T01:56:51.589Z" + url = "https://files.pythonhosted.org/packages/54/aa/340a1463660bf6831f9e39646bf774086dbd8ca7fc3cded9d59bbdf4ad0a/black-26.3.1-cp311-cp311-macosx_11_0_arm64.whl" + hash = "sha256:bf9bf162ed91a26f1adba8efda0b573bc6924ec1408a52cc6f82cb73ec2b142c" + size = 1_689_499 + upload-time = "2026-03-12T03:40:07.642Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/34/b9/f17dea34eecb7cc2609a89627d480fb6caea7b86190708eaa7eb15ed25e7/black-25.11.0-cp311-cp311-win_amd64.whl" - hash = "sha256:7eebd4744dfe92ef1ee349dc532defbf012a88b087bb7ddd688ff59a447b080e" - size = 1_352_904 - upload-time = "2025-11-10T01:59:26.252Z" + url = "https://files.pythonhosted.org/packages/f3/01/b726c93d717d72733da031d2de10b92c9fa4c8d0c67e8a8a372076579279/black-26.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:474c27574d6d7037c1bc875a81d9be0a9a4f9ee95e62800dab3cfaadbf75acd5" + size = 1_754_369 + upload-time = "2026-03-12T03:40:09.279Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/7f/12/5c35e600b515f35ffd737da7febdb2ab66bb8c24d88560d5e3ef3d28c3fd/black-25.11.0-cp312-cp312-macosx_10_13_x86_64.whl" - hash = "sha256:80e7486ad3535636657aa180ad32a7d67d7c273a80e12f1b4bfa0823d54e8fac" - size = 1_772_831 - upload-time = "2025-11-10T02:03:47Z" + url = "https://files.pythonhosted.org/packages/e3/09/61e91881ca291f150cfc9eb7ba19473c2e59df28859a11a88248b5cbbc4d/black-26.3.1-cp311-cp311-win_amd64.whl" + hash = "sha256:5e9d0d86df21f2e1677cc4bd090cd0e446278bcbbe49bf3659c308c3e402843e" + size = 1_413_613 + upload-time = "2026-03-12T03:40:10.943Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/1a/75/b3896bec5a2bb9ed2f989a970ea40e7062f8936f95425879bbe162746fe5/black-25.11.0-cp312-cp312-macosx_11_0_arm64.whl" - hash = "sha256:6cced12b747c4c76bc09b4db057c319d8545307266f41aaee665540bc0e04e96" - size = 1_608_520 - upload-time = "2025-11-10T01:58:46.895Z" + url = "https://files.pythonhosted.org/packages/16/73/544f23891b22e7efe4d8f812371ab85b57f6a01b2fc45e3ba2e52ba985b8/black-26.3.1-cp311-cp311-win_arm64.whl" + hash = "sha256:9a5e9f45e5d5e1c5b5c29b3bd4265dcc90e8b92cf4534520896ed77f791f4da5" + size = 1_219_719 + upload-time = "2026-03-12T03:40:12.597Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/f3/b5/2bfc18330eddbcfb5aab8d2d720663cd410f51b2ed01375f5be3751595b0/black-25.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" - hash = "sha256:6cb2d54a39e0ef021d6c5eef442e10fd71fcb491be6413d083a320ee768329dd" - size = 1_682_719 - upload-time = "2025-11-10T01:56:55.24Z" + url = "https://files.pythonhosted.org/packages/dc/f8/da5eae4fc75e78e6dceb60624e1b9662ab00d6b452996046dfa9b8a6025b/black-26.3.1-cp312-cp312-macosx_10_13_x86_64.whl" + hash = "sha256:b5e6f89631eb88a7302d416594a32faeee9fb8fb848290da9d0a5f2903519fc1" + size = 1_895_920 + upload-time = "2026-03-12T03:40:13.921Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/96/fb/f7dc2793a22cdf74a72114b5ed77fe3349a2e09ef34565857a2f917abdf2/black-25.11.0-cp312-cp312-win_amd64.whl" - hash = "sha256:ae263af2f496940438e5be1a0c1020e13b09154f3af4df0835ea7f9fe7bfa409" - size = 1_362_684 - upload-time = "2025-11-10T01:57:07.639Z" + url = "https://files.pythonhosted.org/packages/2c/9f/04e6f26534da2e1629b2b48255c264cabf5eedc5141d04516d9d68a24111/black-26.3.1-cp312-cp312-macosx_11_0_arm64.whl" + hash = "sha256:41cd2012d35b47d589cb8a16faf8a32ef7a336f56356babd9fcf70939ad1897f" + size = 1_718_499 + upload-time = "2026-03-12T03:40:15.239Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/ad/47/3378d6a2ddefe18553d1115e36aea98f4a90de53b6a3017ed861ba1bd3bc/black-25.11.0-cp313-cp313-macosx_10_13_x86_64.whl" - hash = "sha256:0a1d40348b6621cc20d3d7530a5b8d67e9714906dfd7346338249ad9c6cedf2b" - size = 1_772_446 - upload-time = "2025-11-10T02:02:16.181Z" + url = "https://files.pythonhosted.org/packages/04/91/a5935b2a63e31b331060c4a9fdb5a6c725840858c599032a6f3aac94055f/black-26.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:0f76ff19ec5297dd8e66eb64deda23631e642c9393ab592826fd4bdc97a4bce7" + size = 1_794_994 + upload-time = "2026-03-12T03:40:17.124Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/ba/4b/0f00bfb3d1f7e05e25bfc7c363f54dc523bb6ba502f98f4ad3acf01ab2e4/black-25.11.0-cp313-cp313-macosx_11_0_arm64.whl" - hash = "sha256:51c65d7d60bb25429ea2bf0731c32b2a2442eb4bd3b2afcb47830f0b13e58bfd" - size = 1_607_983 - upload-time = "2025-11-10T02:02:52.502Z" + url = "https://files.pythonhosted.org/packages/e7/0a/86e462cdd311a3c2a8ece708d22aba17d0b2a0d5348ca34b40cdcbea512e/black-26.3.1-cp312-cp312-win_amd64.whl" + hash = "sha256:ddb113db38838eb9f043623ba274cfaf7d51d5b0c22ecb30afe58b1bb8322983" + size = 1_420_867 + upload-time = "2026-03-12T03:40:18.83Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/99/fe/49b0768f8c9ae57eb74cc10a1f87b4c70453551d8ad498959721cc345cb7/black-25.11.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" - hash = "sha256:936c4dd07669269f40b497440159a221ee435e3fddcf668e0c05244a9be71993" - size = 1_682_481 - upload-time = "2025-11-10T01:57:12.35Z" + url = "https://files.pythonhosted.org/packages/5b/e5/22515a19cb7eaee3440325a6b0d95d2c0e88dd180cb011b12ae488e031d1/black-26.3.1-cp312-cp312-win_arm64.whl" + hash = "sha256:dfdd51fc3e64ea4f35873d1b3fb25326773d55d2329ff8449139ebaad7357efb" + size = 1_230_124 + upload-time = "2026-03-12T03:40:20.425Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/55/17/7e10ff1267bfa950cc16f0a411d457cdff79678fbb77a6c73b73a5317904/black-25.11.0-cp313-cp313-win_amd64.whl" - hash = "sha256:f42c0ea7f59994490f4dccd64e6b2dd49ac57c7c84f38b8faab50f8759db245c" - size = 1_363_869 - upload-time = "2025-11-10T01:58:24.608Z" + url = "https://files.pythonhosted.org/packages/f5/77/5728052a3c0450c53d9bb3945c4c46b91baa62b2cafab6801411b6271e45/black-26.3.1-cp313-cp313-macosx_10_13_x86_64.whl" + hash = "sha256:855822d90f884905362f602880ed8b5df1b7e3ee7d0db2502d4388a954cc8c54" + size = 1_895_034 + upload-time = "2026-03-12T03:40:21.813Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/67/c0/cc865ce594d09e4cd4dfca5e11994ebb51604328489f3ca3ae7bb38a7db5/black-25.11.0-cp314-cp314-macosx_10_15_x86_64.whl" - hash = "sha256:35690a383f22dd3e468c85dc4b915217f87667ad9cce781d7b42678ce63c4170" - size = 1_771_358 - upload-time = "2025-11-10T02:03:33.331Z" + url = "https://files.pythonhosted.org/packages/52/73/7cae55fdfdfbe9d19e9a8d25d145018965fe2079fa908101c3733b0c55a0/black-26.3.1-cp313-cp313-macosx_11_0_arm64.whl" + hash = "sha256:8a33d657f3276328ce00e4d37fe70361e1ec7614da5d7b6e78de5426cb56332f" + size = 1_718_503 + upload-time = "2026-03-12T03:40:23.666Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/37/77/4297114d9e2fd2fc8ab0ab87192643cd49409eb059e2940391e7d2340e57/black-25.11.0-cp314-cp314-macosx_11_0_arm64.whl" - hash = "sha256:dae49ef7369c6caa1a1833fd5efb7c3024bb7e4499bf64833f65ad27791b1545" - size = 1_612_902 - upload-time = "2025-11-10T01:59:33.382Z" + url = "https://files.pythonhosted.org/packages/e1/87/af89ad449e8254fdbc74654e6467e3c9381b61472cc532ee350d28cfdafb/black-26.3.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:f1cd08e99d2f9317292a311dfe578fd2a24b15dbce97792f9c4d752275c1fa56" + size = 1_793_557 + upload-time = "2026-03-12T03:40:25.497Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/de/63/d45ef97ada84111e330b2b2d45e1dd163e90bd116f00ac55927fb6bf8adb/black-25.11.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" - hash = "sha256:5bd4a22a0b37401c8e492e994bce79e614f91b14d9ea911f44f36e262195fdda" - size = 1_680_571 - upload-time = "2025-11-10T01:57:04.239Z" + url = "https://files.pythonhosted.org/packages/43/10/d6c06a791d8124b843bf325ab4ac7d2f5b98731dff84d6064eafd687ded1/black-26.3.1-cp313-cp313-win_amd64.whl" + hash = "sha256:c7e72339f841b5a237ff14f7d3880ddd0fc7f98a1199e8c4327f9a4f478c1839" + size = 1_422_766 + upload-time = "2026-03-12T03:40:27.14Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/ff/4b/5604710d61cdff613584028b4cb4607e56e148801ed9b38ee7970799dab6/black-25.11.0-cp314-cp314-win_amd64.whl" - hash = "sha256:aa211411e94fdf86519996b7f5f05e71ba34835d8f0c0f03c00a26271da02664" - size = 1_382_599 - upload-time = "2025-11-10T01:57:57.427Z" + url = "https://files.pythonhosted.org/packages/59/4f/40a582c015f2d841ac24fed6390bd68f0fc896069ff3a886317959c9daf8/black-26.3.1-cp313-cp313-win_arm64.whl" + hash = "sha256:afc622538b430aa4c8c853f7f63bc582b3b8030fd8c80b70fb5fa5b834e575c2" + size = 1_232_140 + upload-time = "2026-03-12T03:40:28.882Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/00/5d/aed32636ed30a6e7f9efd6ad14e2a0b0d687ae7c8c7ec4e4a557174b895c/black-25.11.0-py3-none-any.whl" - hash = "sha256:e3f562da087791e96cefcd9dda058380a442ab322a02e222add53736451f604b" - size = 204_918 - upload-time = "2025-11-10T01:53:48.917Z" + url = "https://files.pythonhosted.org/packages/d5/da/e36e27c9cebc1311b7579210df6f1c86e50f2d7143ae4fcf8a5017dc8809/black-26.3.1-cp314-cp314-macosx_10_15_x86_64.whl" + hash = "sha256:2d6bfaf7fd0993b420bed691f20f9492d53ce9a2bcccea4b797d34e947318a78" + size = 1_889_234 + upload-time = "2026-03-12T03:40:30.964Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/0e/7b/9871acf393f64a5fa33668c19350ca87177b181f44bb3d0c33b2d534f22c/black-26.3.1-cp314-cp314-macosx_11_0_arm64.whl" + hash = "sha256:f89f2ab047c76a9c03f78d0d66ca519e389519902fa27e7a91117ef7611c0568" + size = 1_720_522 + upload-time = "2026-03-12T03:40:32.346Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/03/87/e766c7f2e90c07fb7586cc787c9ae6462b1eedab390191f2b7fc7f6170a9/black-26.3.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:b07fc0dab849d24a80a29cfab8d8a19187d1c4685d8a5e6385a5ce323c1f015f" + size = 1_787_824 + upload-time = "2026-03-12T03:40:33.636Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/ac/94/2424338fb2d1875e9e83eed4c8e9c67f6905ec25afd826a911aea2b02535/black-26.3.1-cp314-cp314-win_amd64.whl" + hash = "sha256:0126ae5b7c09957da2bdbd91a9ba1207453feada9e9fe51992848658c6c8e01c" + size = 1_445_855 + upload-time = "2026-03-12T03:40:35.442Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/86/43/0c3338bd928afb8ee7471f1a4eec3bdbe2245ccb4a646092a222e8669840/black-26.3.1-cp314-cp314-win_arm64.whl" + hash = "sha256:92c0ec1f2cc149551a2b7b47efc32c866406b6891b0ee4625e95967c8f4acfb1" + size = 1_258_109 + upload-time = "2026-03-12T03:40:36.832Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/8e/0d/52d98722666d6fc6c3dd4c76df339501d6efd40e0ff95e6186a7b7f0befd/black-26.3.1-py3-none-any.whl" + hash = "sha256:2bd5aa94fc267d38bb21a70d7410a89f1a1d318841855f698746f8e7f51acd1b" + size = 207_542 + upload-time = "2026-03-12T03:36:01.668Z" [[package]] name = "cfgv" @@ -867,22 +897,22 @@ version = "1.3.1" [[package]] name = "filelock" -version = "3.20.0" +version = "3.20.3" [package.source] registry = "https://pypi.org/simple" [package.sdist] - url = "https://files.pythonhosted.org/packages/58/46/0028a82567109b5ef6e4d2a1f04a583fb513e6cf9527fcdd09afd817deeb/filelock-3.20.0.tar.gz" - hash = "sha256:711e943b4ec6be42e1d4e6690b48dc175c822967466bb31c0c293f34334c13f4" - size = 18_922 - upload-time = "2025-10-08T18:03:50.056Z" + url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz" + hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1" + size = 19_485 + upload-time = "2026-01-09T17:55:05.421Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/76/91/7216b27286936c16f5b4d0c530087e4a54eead683e6b0b73dd0c64844af6/filelock-3.20.0-py3-none-any.whl" - hash = "sha256:339b4732ffda5cd79b13f4e2711a31b0365ce445d95d243bb996273d072546a2" - size = 16_054 - upload-time = "2025-10-08T18:03:48.35Z" + url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl" + hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1" + size = 16_701 + upload-time = "2026-01-09T17:55:04.334Z" [[package]] name = "flake8" @@ -1394,7 +1424,7 @@ version = "0.6.3" [[package]] name = "logging-objects-with-schema" -version = "0.4.0" +version = "0.4.1rc1" [package.source] editable = "." @@ -1803,22 +1833,22 @@ version = "25.0" [[package]] name = "pathspec" -version = "0.12.1" +version = "1.1.1" [package.source] registry = "https://pypi.org/simple" [package.sdist] - url = "https://files.pythonhosted.org/packages/ca/bc/f35b8446f4531a7cb215605d100cd88b7ac6f44ab3fc94870c120ab3adbf/pathspec-0.12.1.tar.gz" - hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - size = 51_043 - upload-time = "2023-12-10T22:30:45Z" + url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz" + hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a" + size = 135_180 + upload-time = "2026-04-27T01:46:08.907Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl" - hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08" - size = 31_191 - upload-time = "2023-12-10T22:30:43.14Z" + url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl" + hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189" + size = 57_328 + upload-time = "2026-04-27T01:46:07.06Z" [[package]] name = "platformdirs" @@ -1932,26 +1962,26 @@ version = "3.4.0" [[package]] name = "pygments" -version = "2.19.2" +version = "2.20.0" [package.source] registry = "https://pypi.org/simple" [package.sdist] - url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz" - hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887" - size = 4_968_631 - upload-time = "2025-06-21T13:39:12.283Z" + url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz" + hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f" + size = 4_955_991 + upload-time = "2026-03-29T13:29:33.898Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl" - hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b" - size = 1_225_217 - upload-time = "2025-06-21T13:39:07.939Z" + url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl" + hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176" + size = 1_231_151 + upload-time = "2026-03-29T13:29:30.038Z" [[package]] name = "pytest" -version = "9.0.1" +version = "9.0.3" [package.source] registry = "https://pypi.org/simple" @@ -1981,16 +2011,16 @@ version = "9.0.1" marker = "python_full_version < '3.11'" [package.sdist] - url = "https://files.pythonhosted.org/packages/07/56/f013048ac4bc4c1d9be45afd4ab209ea62822fb1598f40687e6bf45dcea4/pytest-9.0.1.tar.gz" - hash = "sha256:3e9c069ea73583e255c3b21cf46b8d3c56f6e3a1a8f6da94ccb0fcf57b9d73c8" - size = 1_564_125 - upload-time = "2025-11-12T13:05:09.333Z" + url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz" + hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c" + size = 1_572_165 + upload-time = "2026-04-07T17:16:18.027Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/0b/8b/6300fb80f858cda1c51ffa17075df5d846757081d11ab4aa35cef9e6258b/pytest-9.0.1-py3-none-any.whl" - hash = "sha256:67be0030d194df2dfa7b556f2e56fb3c3315bd5c8822c6951162b92b32ce7dad" - size = 373_668 - upload-time = "2025-11-12T13:05:07.379Z" + url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl" + hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9" + size = 375_249 + upload-time = "2026-04-07T17:16:16.13Z" [[package]] name = "pytest-cov" @@ -2023,22 +2053,202 @@ version = "7.0.0" [[package]] name = "pytokens" -version = "0.3.0" +version = "0.4.1" [package.source] registry = "https://pypi.org/simple" [package.sdist] - url = "https://files.pythonhosted.org/packages/4e/8d/a762be14dae1c3bf280202ba3172020b2b0b4c537f94427435f19c413b72/pytokens-0.3.0.tar.gz" - hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a" - size = 17_644 - upload-time = "2025-11-05T13:36:35.34Z" + url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz" + hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a" + size = 23_015 + upload-time = "2026-01-30T01:03:45.924Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl" + hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5" + size = 161_522 + upload-time = "2026-01-30T01:02:50.393Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe" + size = 246_945 + upload-time = "2026-01-30T01:02:52.399Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c" + size = 259_525 + upload-time = "2026-01-30T01:02:53.737Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl" + hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7" + size = 262_693 + upload-time = "2026-01-30T01:02:54.871Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl" + hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2" + size = 103_567 + upload-time = "2026-01-30T01:02:56.414Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl" + hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440" + size = 160_864 + upload-time = "2026-01-30T01:02:57.882Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc" + size = 248_565 + upload-time = "2026-01-30T01:02:59.912Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d" + size = 260_824 + upload-time = "2026-01-30T01:03:01.471Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl" + hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16" + size = 264_075 + upload-time = "2026-01-30T01:03:04.143Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl" + hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6" + size = 103_323 + upload-time = "2026-01-30T01:03:05.412Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl" + hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083" + size = 160_663 + upload-time = "2026-01-30T01:03:06.473Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1" + size = 255_626 + upload-time = "2026-01-30T01:03:08.177Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1" + size = 269_779 + upload-time = "2026-01-30T01:03:09.756Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl" + hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9" + size = 268_076 + upload-time = "2026-01-30T01:03:10.957Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl" + hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68" + size = 103_552 + upload-time = "2026-01-30T01:03:12.066Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl" + hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b" + size = 160_720 + upload-time = "2026-01-30T01:03:13.843Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f" + size = 254_204 + upload-time = "2026-01-30T01:03:14.886Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1" + size = 268_423 + upload-time = "2026-01-30T01:03:15.936Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl" + hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4" + size = 266_859 + upload-time = "2026-01-30T01:03:17.458Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl" + hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78" + size = 103_520 + upload-time = "2026-01-30T01:03:18.652Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl" + hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321" + size = 160_821 + upload-time = "2026-01-30T01:03:19.684Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa" + size = 254_263 + upload-time = "2026-01-30T01:03:20.834Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d" + size = 268_071 + upload-time = "2026-01-30T01:03:21.888Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl" + hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324" + size = 271_716 + upload-time = "2026-01-30T01:03:23.633Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl" + hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9" + size = 104_539 + upload-time = "2026-01-30T01:03:24.788Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl" + hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb" + size = 168_474 + upload-time = "2026-01-30T01:03:26.428Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl" + hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3" + size = 290_473 + upload-time = "2026-01-30T01:03:27.415Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl" + hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975" + size = 303_485 + upload-time = "2026-01-30T01:03:28.558Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl" + hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a" + size = 306_698 + upload-time = "2026-01-30T01:03:29.653Z" + + [[package.wheels]] + url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl" + hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918" + size = 116_287 + upload-time = "2026-01-30T01:03:30.912Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/84/25/d9db8be44e205a124f6c98bc0324b2bb149b7431c53877fc6d1038dddaf5/pytokens-0.3.0-py3-none-any.whl" - hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3" - size = 12_195 - upload-time = "2025-11-05T13:36:33.183Z" + url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl" + hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de" + size = 13_729 + upload-time = "2026-01-30T01:03:45.029Z" [[package]] name = "pyyaml" @@ -2713,7 +2923,7 @@ version = "4.15.0" [[package]] name = "virtualenv" -version = "20.35.4" +version = "20.36.1" [package.source] registry = "https://pypi.org/simple" @@ -2732,16 +2942,16 @@ version = "20.35.4" marker = "python_full_version < '3.11'" [package.sdist] - url = "https://files.pythonhosted.org/packages/20/28/e6f1a6f655d620846bd9df527390ecc26b3805a0c5989048c210e22c5ca9/virtualenv-20.35.4.tar.gz" - hash = "sha256:643d3914d73d3eeb0c552cbb12d7e82adf0e504dbf86a3182f8771a153a1971c" - size = 6_028_799 - upload-time = "2025-10-29T06:57:40.511Z" + url = "https://files.pythonhosted.org/packages/aa/a3/4d310fa5f00863544e1d0f4de93bddec248499ccf97d4791bc3122c9d4f3/virtualenv-20.36.1.tar.gz" + hash = "sha256:8befb5c81842c641f8ee658481e42641c68b5eab3521d8e092d18320902466ba" + size = 6_032_239 + upload-time = "2026-01-09T18:21:01.296Z" [[package.wheels]] - url = "https://files.pythonhosted.org/packages/79/0c/c05523fa3181fdf0c9c52a6ba91a23fbf3246cc095f26f6516f9c60e6771/virtualenv-20.35.4-py3-none-any.whl" - hash = "sha256:c21c9cede36c9753eeade68ba7d523529f228a403463376cf821eaae2b650f1b" - size = 6_005_095 - upload-time = "2025-10-29T06:57:37.598Z" + url = "https://files.pythonhosted.org/packages/6a/2a/dc2228b2888f51192c7dc766106cd475f1b768c10caaf9727659726f7391/virtualenv-20.36.1-py3-none-any.whl" + hash = "sha256:575a8d6b124ef88f6f51d56d656132389f961062a9177016a50e4f507bbcc19f" + size = 6_008_258 + upload-time = "2026-01-09T18:20:59.425Z" [[package]] name = "vulture"