aiogram-cmds 0.2.0__tar.gz → 0.3.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/workflows/ci.yml +2 -2
  2. aiogram_cmds-0.3.0/.github/workflows/native.yml +88 -0
  3. aiogram_cmds-0.3.0/.github/workflows/publish-native.yml +65 -0
  4. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.gitignore +4 -0
  5. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/CHANGELOG.md +12 -0
  6. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/PKG-INFO +13 -1
  7. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/README.md +7 -0
  8. aiogram_cmds-0.3.0/benchmarks/pyperf_suite.py +24 -0
  9. aiogram_cmds-0.3.0/benchmarks/run.py +474 -0
  10. aiogram_cmds-0.3.0/docs/compiled-profiles.md +79 -0
  11. aiogram_cmds-0.3.0/examples/compiled_profiles.py +28 -0
  12. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/mkdocs.yml +1 -0
  13. aiogram_cmds-0.3.0/native/BENCHMARKS.md +18 -0
  14. aiogram_cmds-0.3.0/native/Cargo.lock +758 -0
  15. aiogram_cmds-0.3.0/native/Cargo.toml +23 -0
  16. aiogram_cmds-0.3.0/native/LICENSE +21 -0
  17. aiogram_cmds-0.3.0/native/README.md +16 -0
  18. aiogram_cmds-0.3.0/native/benches/core.rs +34 -0
  19. aiogram_cmds-0.3.0/native/pyproject.toml +17 -0
  20. aiogram_cmds-0.3.0/native/src/lib.rs +183 -0
  21. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/pyproject.toml +9 -1
  22. aiogram_cmds-0.3.0/reports/implementation/0.3.0-performance-rust.md +81 -0
  23. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/__init__.py +15 -0
  24. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/apply.py +14 -57
  25. aiogram_cmds-0.3.0/src/aiogram_cmds/compiled.py +302 -0
  26. aiogram_cmds-0.3.0/src/aiogram_cmds/compiled_delivery.py +59 -0
  27. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/delivery.py +23 -0
  28. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/dynamic.py +6 -7
  29. aiogram_cmds-0.3.0/src/aiogram_cmds/engines.py +68 -0
  30. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/manager.py +73 -0
  31. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/registry.py +2 -2
  32. aiogram_cmds-0.3.0/src/aiogram_cmds/scopes.py +63 -0
  33. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/version.py +1 -1
  34. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/integration/test_examples.py +3 -1
  35. aiogram_cmds-0.3.0/tests/unit/test_compiled.py +310 -0
  36. aiogram_cmds-0.3.0/tools/smoke_native.py +16 -0
  37. aiogram_cmds-0.3.0/tools/verify_native_artifacts.py +285 -0
  38. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/uv.lock +451 -91
  39. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.cursorignore +0 -0
  40. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.gitattributes +0 -0
  41. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/CODEOWNERS +0 -0
  42. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  43. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  44. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/documentation_issue.yml +0 -0
  45. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  46. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/performance_issue.yml +0 -0
  47. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/ISSUE_TEMPLATE/question_help.yml +0 -0
  48. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  49. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/dependabot.yml +0 -0
  50. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/workflows/docs.yml +0 -0
  51. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/workflows/pr-management.yml +0 -0
  52. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/.github/workflows/release.yml +0 -0
  53. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/CHANGES/README.md +0 -0
  54. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  55. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/CONTRIBUTING.md +0 -0
  56. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/DEPLOYMENT.md +0 -0
  57. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/LICENSE +0 -0
  58. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/SECURITY.md +0 -0
  59. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/ARCHITECTURE.md +0 -0
  60. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/ROADMAP.md +0 -0
  61. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/TESTING.md +0 -0
  62. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/api/configuration.md +0 -0
  63. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/api/core.md +0 -0
  64. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/api/translator.md +0 -0
  65. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/command-registration-guide.md +0 -0
  66. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/configuration.md +0 -0
  67. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/deployment-guide.md +0 -0
  68. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/faq.md +0 -0
  69. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/i18n.md +0 -0
  70. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/index.md +0 -0
  71. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/installation.md +0 -0
  72. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/migration-0.2.md +0 -0
  73. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/performance.md +0 -0
  74. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/quickstart.md +0 -0
  75. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/release.md +0 -0
  76. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/releasing.md +0 -0
  77. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/troubleshooting.md +0 -0
  78. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/tutorials/advanced-profiles.md +0 -0
  79. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/tutorials/basic-setup.md +0 -0
  80. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/tutorials/dynamic-commands.md +0 -0
  81. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/tutorials/i18n-integration.md +0 -0
  82. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/docs/verification.md +0 -0
  83. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/README.md +0 -0
  84. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/application_profiles.py +0 -0
  85. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/basic_bot.py +0 -0
  86. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/dynamic_bot.py +0 -0
  87. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/i18n_bot.py +0 -0
  88. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/locales/en/LC_MESSAGES/messages.po +0 -0
  89. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/locales/es/LC_MESSAGES/messages.po +0 -0
  90. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/locales/ru/LC_MESSAGES/messages.po +0 -0
  91. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/examples/profile_based_bot.py +0 -0
  92. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/reports/README.md +0 -0
  93. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/reports/application-profiles-0.2.md +0 -0
  94. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/reports/shared-repository-conventions.md +0 -0
  95. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/auto_setup.py +0 -0
  96. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/builder.py +0 -0
  97. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/builders_configured.py +0 -0
  98. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/customize.py +0 -0
  99. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/policy.py +0 -0
  100. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/py.typed +0 -0
  101. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/setters.py +0 -0
  102. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/settings.py +0 -0
  103. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/src/aiogram_cmds/translator.py +0 -0
  104. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/conftest.py +0 -0
  105. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/integration/conftest.py +0 -0
  106. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/integration/test_full_workflow.py +0 -0
  107. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/perf/conftest.py +0 -0
  108. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/perf/test_benchmarks.py +0 -0
  109. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_adapter_contracts.py +0 -0
  110. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_apply.py +0 -0
  111. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_auto_setup.py +0 -0
  112. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_builder.py +0 -0
  113. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_delivery.py +0 -0
  114. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_manager.py +0 -0
  115. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_manager_failures.py +0 -0
  116. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_package_metadata.py +0 -0
  117. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_policy.py +0 -0
  118. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_registry.py +0 -0
  119. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_setters.py +0 -0
  120. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_settings.py +0 -0
  121. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tests/unit/test_translator.py +0 -0
  122. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/README.md +0 -0
  123. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/check_version_tag.py +0 -0
  124. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/deploy.ps1 +0 -0
  125. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/deploy.sh +0 -0
  126. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/gen_tree.py +0 -0
  127. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/i18n/compile.ps1 +0 -0
  128. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/i18n/extract.ps1 +0 -0
  129. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/i18n/init.ps1 +0 -0
  130. {aiogram_cmds-0.2.0 → aiogram_cmds-0.3.0}/tools/i18n/update.ps1 +0 -0
@@ -39,7 +39,7 @@ jobs:
39
39
  strategy:
40
40
  fail-fast: false
41
41
  matrix:
42
- python: ['3.10', '3.11', '3.12', '3.13']
42
+ python: ['3.10', '3.11', '3.12', '3.13', '3.14']
43
43
  steps:
44
44
  - uses: actions/checkout@v6
45
45
  - uses: astral-sh/setup-uv@v7
@@ -138,7 +138,7 @@ jobs:
138
138
  for artifact in dist/*.whl dist/*.tar.gz; do
139
139
  target=$(mktemp -d)
140
140
  uv venv "$target/env" --python '${{ matrix.python }}'
141
- uv pip install --python "$target/env/bin/python" "$artifact" '${{ matrix.aiogram }}' pytest '${{ matrix.asyncio }}' pytest-mock babel tomli
141
+ uv pip install --python "$target/env/bin/python" "$artifact" '${{ matrix.aiogram }}' pytest '${{ matrix.asyncio }}' pytest-mock babel tomli hypothesis
142
142
  uv pip check --python "$target/env/bin/python"
143
143
  cp -R tests examples "$target/"
144
144
  cp pyproject.toml "$target/"
@@ -0,0 +1,88 @@
1
+ name: Native candidate
2
+ on:
3
+ pull_request:
4
+ workflow_dispatch:
5
+ permissions:
6
+ contents: read
7
+ concurrency:
8
+ group: native-${{ github.ref }}
9
+ cancel-in-progress: true
10
+ jobs:
11
+ wheels:
12
+ strategy:
13
+ fail-fast: false
14
+ max-parallel: 5
15
+ matrix:
16
+ include:
17
+ - {os: ubuntu-latest, target: x86_64, manylinux: '2014'}
18
+ - {os: ubuntu-24.04-arm, target: aarch64, manylinux: '2014'}
19
+ - {os: ubuntu-latest, target: x86_64-unknown-linux-musl, manylinux: musllinux_1_2}
20
+ - {os: ubuntu-24.04-arm, target: aarch64-unknown-linux-musl, manylinux: musllinux_1_2}
21
+ - {os: macos-15-intel, target: x86_64, manylinux: auto}
22
+ - {os: macos-latest, target: aarch64, manylinux: auto}
23
+ - {os: windows-latest, target: x86_64, manylinux: auto}
24
+ runs-on: ${{ matrix.os }}
25
+ steps:
26
+ - uses: actions/checkout@v6
27
+ - uses: PyO3/maturin-action@v1
28
+ with:
29
+ target: ${{ matrix.target }}
30
+ manylinux: ${{ matrix.manylinux }}
31
+ args: --release --locked --manifest-path native/Cargo.toml --out native-dist
32
+ - if: matrix.manylinux == 'musllinux_1_2'
33
+ shell: bash
34
+ run: |
35
+ for version in 3.10 3.11 3.12 3.13 3.14; do
36
+ docker run --rm -v "$PWD:/work" -w /work "python:$version-alpine" sh -c 'pip install native-dist/*.whl && python tools/smoke_native.py'
37
+ done
38
+ - uses: actions/upload-artifact@v6
39
+ with:
40
+ name: native-${{ matrix.os }}-${{ matrix.target }}
41
+ path: native-dist/*.whl
42
+ runtime:
43
+ needs: wheels
44
+ runs-on: ${{ matrix.os }}
45
+ strategy:
46
+ fail-fast: false
47
+ max-parallel: 5
48
+ matrix:
49
+ python: ['3.10', '3.11', '3.12', '3.13', '3.14']
50
+ os: [ubuntu-latest, ubuntu-24.04-arm, macos-15-intel, macos-latest, windows-latest]
51
+ include:
52
+ - {os: ubuntu-latest, target: x86_64}
53
+ - {os: ubuntu-24.04-arm, target: aarch64}
54
+ - {os: macos-15-intel, target: x86_64}
55
+ - {os: macos-latest, target: aarch64}
56
+ - {os: windows-latest, target: x86_64}
57
+ steps:
58
+ - uses: actions/checkout@v6
59
+ - uses: astral-sh/setup-uv@v7
60
+ with:
61
+ python-version: ${{ matrix.python }}
62
+ - uses: actions/download-artifact@v6
63
+ with:
64
+ name: native-${{ matrix.os }}-${{ matrix.target }}
65
+ path: native-dist
66
+ - run: uv sync --frozen --all-extras --all-groups
67
+ - run: uv pip install native-dist/*.whl
68
+ shell: bash
69
+ - run: uv run --no-sync python tools/smoke_native.py
70
+ - run: uv run --no-sync pytest tests/unit tests/integration --cov=aiogram_cmds --cov-fail-under=80
71
+ rust:
72
+ runs-on: ubuntu-latest
73
+ steps:
74
+ - uses: actions/checkout@v6
75
+ - run: cargo test --locked --manifest-path native/Cargo.toml
76
+ - run: cargo clippy --locked --manifest-path native/Cargo.toml --all-targets -- -D warnings
77
+ source:
78
+ runs-on: ubuntu-latest
79
+ steps:
80
+ - uses: actions/checkout@v6
81
+ - uses: PyO3/maturin-action@v1
82
+ with:
83
+ command: sdist
84
+ args: --manifest-path native/Cargo.toml --out native-dist
85
+ - uses: actions/upload-artifact@v6
86
+ with:
87
+ name: native-source
88
+ path: native-dist/*.tar.gz
@@ -0,0 +1,65 @@
1
+ name: Publish verified native companion
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ manifest_sha256:
7
+ description: SHA256 of the independently reviewed native release SHA256SUMS
8
+ required: true
9
+ type: string
10
+
11
+ permissions:
12
+ contents: read
13
+
14
+ concurrency:
15
+ group: publish-native-${{ github.ref }}
16
+ cancel-in-progress: false
17
+
18
+ jobs:
19
+ verify:
20
+ if: github.ref_type == 'tag' && startsWith(github.ref_name, 'native-v')
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 10
23
+ steps:
24
+ - uses: actions/checkout@v6
25
+ with:
26
+ persist-credentials: false
27
+ - uses: astral-sh/setup-uv@v7
28
+ with:
29
+ python-version: '3.12'
30
+ - name: Download exact reviewed native artifacts
31
+ env:
32
+ GH_TOKEN: ${{ github.token }}
33
+ run: gh release download "$GITHUB_REF_NAME" --pattern '*.whl' --pattern '*.tar.gz' --pattern SHA256SUMS --dir native-dist
34
+ - name: Validate exact identity, versions, checksums and complete wheel matrix
35
+ env:
36
+ MANIFEST_SHA256: ${{ inputs.manifest_sha256 }}
37
+ run: >-
38
+ uv run --no-project python tools/verify_native_artifacts.py
39
+ --directory native-dist --tag "$GITHUB_REF_NAME"
40
+ --manifest-sha256 "$MANIFEST_SHA256"
41
+ - run: uvx twine check native-dist/*.whl native-dist/*.tar.gz
42
+ - run: uvx abi3audit --strict native-dist/*.whl
43
+ - uses: actions/upload-artifact@v6
44
+ with:
45
+ name: verified-native-distributions
46
+ path: |
47
+ native-dist/*.whl
48
+ native-dist/*.tar.gz
49
+ if-no-files-found: error
50
+ publish:
51
+ needs: verify
52
+ runs-on: ubuntu-latest
53
+ timeout-minutes: 10
54
+ environment: pypi
55
+ permissions:
56
+ id-token: write
57
+ steps:
58
+ - uses: actions/download-artifact@v7
59
+ with:
60
+ name: verified-native-distributions
61
+ path: native-dist
62
+ - name: Publish verified companion using Trusted Publishing
63
+ uses: pypa/gh-action-pypi-publish@release/v1
64
+ with:
65
+ packages-dir: native-dist/
@@ -232,3 +232,7 @@ dump.rdb
232
232
 
233
233
  # Static analysis cache
234
234
  .ruff_cache/
235
+
236
+ # Optional native build outputs
237
+ native/target/
238
+ native/dist/
@@ -2,6 +2,18 @@
2
2
 
3
3
  <!-- towncrier release notes start -->
4
4
 
5
+ ## [0.3.0] - Unreleased
6
+
7
+ - Add explicitly revisioned immutable compiled command profiles and resolved batch
8
+ payloads. Preserve dynamic translator evaluation for existing live APIs.
9
+ - Optimize Python profile resolution and reuse canonical compiled command JSON.
10
+ - Add an explicit optional Rust engine candidate with ABI validation, independent
11
+ native packaging and parity tests. Python remains the default; companion
12
+ publication was withheld after the serial performance gate failed. No native
13
+ tag or dependency extra is released; the candidate remains buildable source.
14
+ - Add installed-package CPU/latency evidence, pyperf and Criterion benchmarks,
15
+ and Python 3.14 / native platform CI.
16
+
5
17
  ## [0.2.0] - 2026-11-10
6
18
 
7
19
  ### Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: aiogram-cmds
3
- Version: 0.2.0
3
+ Version: 0.3.0
4
4
  Summary: Command management library for aiogram v3
5
5
  Project-URL: Homepage, https://github.com/ArmanAvanesyan/aiogram-cmds
6
6
  Project-URL: Repository, https://github.com/ArmanAvanesyan/aiogram-cmds
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Classifier: Programming Language :: Python :: 3.12
19
19
  Classifier: Programming Language :: Python :: 3.13
20
+ Classifier: Programming Language :: Python :: 3.14
20
21
  Classifier: Topic :: Communications :: Chat
21
22
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
22
23
  Requires-Python: >=3.10
@@ -28,8 +29,12 @@ Requires-Dist: babel>=2.16; extra == 'dev'
28
29
  Requires-Dist: bandit>=1.7.0; extra == 'dev'
29
30
  Requires-Dist: black>=23.0.0; extra == 'dev'
30
31
  Requires-Dist: build>=1.0.0; extra == 'dev'
32
+ Requires-Dist: hypothesis>=6; extra == 'dev'
31
33
  Requires-Dist: isort>=5.12.0; extra == 'dev'
34
+ Requires-Dist: orjson>=3.10; extra == 'dev'
32
35
  Requires-Dist: pip-audit>=2.9.0; (python_version >= '3.11') and extra == 'dev'
36
+ Requires-Dist: psutil>=6; extra == 'dev'
37
+ Requires-Dist: pyperf>=2.9; extra == 'dev'
33
38
  Requires-Dist: pyright>=1.1.0; extra == 'dev'
34
39
  Requires-Dist: pytest-asyncio>=0.21.0; extra == 'dev'
35
40
  Requires-Dist: pytest-benchmark>=4.0.0; extra == 'dev'
@@ -312,3 +317,10 @@ locale/menu slots, default-language fallback, explicit language cleanup,
312
317
  confirmed payload fingerprints and partial batch outcomes. Run
313
318
  `uv run python examples/application_profiles.py --dry-run` for a network-free
314
319
  example. The library never configures application logging.
320
+
321
+ Compiled immutable profiles and explicit optional engines are described in [performance guidance](docs/compiled-profiles.md). Python remains the default; native publication is benchmark-gated.
322
+
323
+ The 0.3.0 native candidate **did not pass its release performance gate**. Native
324
+ publication, native tags and a dependency extra are withheld. Rust code remains
325
+ available to build from source; the Python 0.3.0 distribution can release
326
+ independently. Use compiled Python profiles for explicit snapshot reuse.
@@ -267,3 +267,10 @@ locale/menu slots, default-language fallback, explicit language cleanup,
267
267
  confirmed payload fingerprints and partial batch outcomes. Run
268
268
  `uv run python examples/application_profiles.py --dry-run` for a network-free
269
269
  example. The library never configures application logging.
270
+
271
+ Compiled immutable profiles and explicit optional engines are described in [performance guidance](docs/compiled-profiles.md). Python remains the default; native publication is benchmark-gated.
272
+
273
+ The 0.3.0 native candidate **did not pass its release performance gate**. Native
274
+ publication, native tags and a dependency extra are withheld. Rust code remains
275
+ available to build from source; the Python 0.3.0 distribution can release
276
+ independently. Use compiled Python profiles for explicit snapshot reuse.
@@ -0,0 +1,24 @@
1
+ """Calibrated subprocess pyperf Runner suite against the installed distribution."""
2
+
3
+ import pyperf
4
+ from run import workloads
5
+
6
+
7
+ def command_line(command, args):
8
+ command.extend(["--engine", args.engine, "--workload", args.workload])
9
+
10
+
11
+ runner = pyperf.Runner(add_cmdline_args=command_line)
12
+ runner.argparser.add_argument("--engine", choices=["python", "rust"], default="python")
13
+ runner.argparser.add_argument(
14
+ "--workload", default="", help="Optional workload name substring"
15
+ )
16
+ args = runner.parse_args()
17
+ runner.metadata["engine"] = args.engine
18
+ runner.metadata["seed"] = 1729
19
+ for name, function, _loops, _counters, _new_only in workloads(args.engine, False):
20
+ if "fake_telegram" not in name and args.workload in name:
21
+ if "confirmation_hit" in name:
22
+ runner.bench_async_func(name, function)
23
+ else:
24
+ runner.bench_func(name, function)