hyperi-ci 2.2.2__tar.gz → 2.2.3__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 (223) hide show
  1. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/CHANGELOG.md +9 -0
  2. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/PKG-INFO +2 -1
  3. hyperi_ci-2.2.3/VERSION +1 -0
  4. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/pyproject.toml +19 -2
  5. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/detect.py +73 -7
  6. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_detect_tier.py +99 -0
  7. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/uv.lock +9 -248
  8. hyperi_ci-2.2.2/VERSION +0 -1
  9. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/.ai-version +0 -0
  10. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/doco.md +0 -0
  11. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/load.md +0 -0
  12. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/review.md +0 -0
  13. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/save.md +0 -0
  14. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/setup-claude.md +0 -0
  15. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/simplify.md +0 -0
  16. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/commands/standards.md +0 -0
  17. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/UNIVERSAL.md +0 -0
  18. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/ai-conduct.md +0 -0
  19. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/ansible.md +0 -0
  20. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/bash.md +0 -0
  21. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/chars-policy.md +0 -0
  22. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/ci.md +0 -0
  23. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/clickhouse-sql.md +0 -0
  24. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/code-header.md +0 -0
  25. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/code-style.md +0 -0
  26. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/config-and-logging.md +0 -0
  27. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/cpp.md +0 -0
  28. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/design-principles.md +0 -0
  29. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/dfe-metrics.md +0 -0
  30. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/docker.md +0 -0
  31. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/error-handling.md +0 -0
  32. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/git.md +0 -0
  33. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/golang.md +0 -0
  34. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/issue-management.md +0 -0
  35. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/k8s.md +0 -0
  36. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/licensing.md +0 -0
  37. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/mocks-policy.md +0 -0
  38. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/pki.md +0 -0
  39. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/python.md +0 -0
  40. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/repo-naming.md +0 -0
  41. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/rust.md +0 -0
  42. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/security.md +0 -0
  43. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/sql-clickhouse.md +0 -0
  44. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/terraform.md +0 -0
  45. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/testing.md +0 -0
  46. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/typescript.md +0 -0
  47. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/rules/universal.md +0 -0
  48. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/settings.json +0 -0
  49. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/ai-common/SKILL.md +0 -0
  50. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/ai-guidelines/SKILL.md +0 -0
  51. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/bleeding-edge/SKILL.md +0 -0
  52. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/ci-check/SKILL.md +0 -0
  53. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/ci-logs/SKILL.md +0 -0
  54. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/ci-watch/SKILL.md +0 -0
  55. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/deps/SKILL.md +0 -0
  56. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/docs-audit/SKILL.md +0 -0
  57. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/documentation/SKILL.md +0 -0
  58. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/python/SKILL.md +0 -0
  59. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/release/SKILL.md +0 -0
  60. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/standards/SKILL.md +0 -0
  61. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/test-review/SKILL.md +0 -0
  62. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.claude/skills/verification/SKILL.md +0 -0
  63. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.gitattributes +0 -0
  64. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/actions/predict-version/action.yml +0 -0
  65. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/_release-tail.yml +0 -0
  66. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/ci.yml +0 -0
  67. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/go-ci.yml +0 -0
  68. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/python-ci.yml +0 -0
  69. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/rust-ci.yml +0 -0
  70. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.github/workflows/ts-ci.yml +0 -0
  71. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.gitignore +0 -0
  72. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.gitmodules +0 -0
  73. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.hyperi-ci.yaml +0 -0
  74. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.mcp.json +0 -0
  75. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/.releaserc.yaml +0 -0
  76. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/AI-TRAINING-POLICY.md +0 -0
  77. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/CLAUDE.md +0 -0
  78. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/LICENSE +0 -0
  79. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/README.md +0 -0
  80. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/STATE.md +0 -0
  81. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/TODO.md +0 -0
  82. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/config/commit-types.yaml +0 -0
  83. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/config/org.yaml +0 -0
  84. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/config/runners.yaml +0 -0
  85. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/config/secrets-access.yaml +0 -0
  86. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/config/versions.yaml +0 -0
  87. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/ARC-RUNNERS.md +0 -0
  88. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/ARCHITECTURE.md +0 -0
  89. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/CI-LESSONS.md +0 -0
  90. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/DESIGN.md +0 -0
  91. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/JFROG-MIGRATION.md +0 -0
  92. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/MIGRATION-GUIDE.md +0 -0
  93. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/PGO-WORKLOAD-GUIDE.md +0 -0
  94. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/deployment-contract.md +0 -0
  95. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/migration/deployment-contract-tier3.md +0 -0
  96. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/rust.md +0 -0
  97. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/docs/typescript.md +0 -0
  98. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/renovate.json +0 -0
  99. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/robots.txt +0 -0
  100. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/scripts/pre-commit-versions.sh +0 -0
  101. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/scripts/setup-rust-dev.py +0 -0
  102. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/scripts/sync-secrets-access.py +0 -0
  103. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/scripts/update-versions.py +0 -0
  104. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/__init__.py +0 -0
  105. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/cli.py +0 -0
  106. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/common.py +0 -0
  107. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/defaults.yaml +0 -0
  108. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/native-deps/golang.yaml +0 -0
  109. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/native-deps/python.yaml +0 -0
  110. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/native-deps/rust.yaml +0 -0
  111. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/native-deps/typescript.yaml +0 -0
  112. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/org.yaml +0 -0
  113. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/toolchains/gcc.yaml +0 -0
  114. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config/toolchains/llvm.yaml +0 -0
  115. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/config.py +0 -0
  116. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/__init__.py +0 -0
  117. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/binary_stage.py +0 -0
  118. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/build.py +0 -0
  119. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/compose.py +0 -0
  120. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/detect.py +0 -0
  121. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/labels.py +0 -0
  122. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/manifest.py +0 -0
  123. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/registry.py +0 -0
  124. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/stage.py +0 -0
  125. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/container/templates.py +0 -0
  126. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/__init__.py +0 -0
  127. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/cli.py +0 -0
  128. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/contract.py +0 -0
  129. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/registry.py +0 -0
  130. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/scaffold.py +0 -0
  131. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/deployment/stage.py +0 -0
  132. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/detect.py +0 -0
  133. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/dispatch.py +0 -0
  134. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/gh.py +0 -0
  135. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/init.py +0 -0
  136. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/install_deps.py +0 -0
  137. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/__init__.py +0 -0
  138. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/_build_common.py +0 -0
  139. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/golang/__init__.py +0 -0
  140. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/golang/build.py +0 -0
  141. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/golang/publish.py +0 -0
  142. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/golang/quality.py +0 -0
  143. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/golang/test.py +0 -0
  144. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/python/__init__.py +0 -0
  145. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/python/build.py +0 -0
  146. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/python/publish.py +0 -0
  147. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/python/quality.py +0 -0
  148. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/python/test.py +0 -0
  149. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/quality_common.py +0 -0
  150. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/__init__.py +0 -0
  151. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/build.py +0 -0
  152. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/optimize.py +0 -0
  153. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/pgo.py +0 -0
  154. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/publish.py +0 -0
  155. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/quality.py +0 -0
  156. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/rust/test.py +0 -0
  157. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/__init__.py +0 -0
  158. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/_common.py +0 -0
  159. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/build.py +0 -0
  160. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/install_deps.py +0 -0
  161. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/publish.py +0 -0
  162. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/quality.py +0 -0
  163. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/languages/typescript/test.py +0 -0
  164. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/logs.py +0 -0
  165. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/migrate.py +0 -0
  166. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/native_deps.py +0 -0
  167. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/publish/__init__.py +0 -0
  168. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/publish/binaries.py +0 -0
  169. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/publish/dispatch.py +0 -0
  170. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/publish_binaries.py +0 -0
  171. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/push.py +0 -0
  172. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/quality/__init__.py +0 -0
  173. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/quality/commit_validation.py +0 -0
  174. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/quality/gitleaks.py +0 -0
  175. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/release.py +0 -0
  176. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/trigger.py +0 -0
  177. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/upgrade.py +0 -0
  178. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/src/hyperi_ci/watch.py +0 -0
  179. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/README.md +0 -0
  180. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/grpc-server.sh +0 -0
  181. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/http-server.sh +0 -0
  182. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/kafka-consumer.sh +0 -0
  183. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/kafka-producer.sh +0 -0
  184. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/templates/pgo-workload/multi-protocol.sh +0 -0
  185. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/__init__.py +0 -0
  186. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/integration/__init__.py +0 -0
  187. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/integration/test_rust_build_optimize.py +0 -0
  188. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/__init__.py +0 -0
  189. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/__init__.py +0 -0
  190. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_contract.py +0 -0
  191. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_emit_artefacts_cli.py +0 -0
  192. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_registry_cascade.py +0 -0
  193. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_scaffold.py +0 -0
  194. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/deployment/test_stage.py +0 -0
  195. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_cli.py +0 -0
  196. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_commit_validation.py +0 -0
  197. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_common.py +0 -0
  198. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_config.py +0 -0
  199. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_binary_stage.py +0 -0
  200. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_build.py +0 -0
  201. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_compose.py +0 -0
  202. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_detect.py +0 -0
  203. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_labels.py +0 -0
  204. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_manifest.py +0 -0
  205. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_registry.py +0 -0
  206. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_stage.py +0 -0
  207. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_container_templates.py +0 -0
  208. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_detect.py +0 -0
  209. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_dispatch_alias.py +0 -0
  210. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_dispatch_status.py +0 -0
  211. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_gh.py +0 -0
  212. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_init.py +0 -0
  213. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_migrate.py +0 -0
  214. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_native_deps.py +0 -0
  215. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_publish.py +0 -0
  216. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_push.py +0 -0
  217. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_rust_optimize.py +0 -0
  218. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_rust_pgo.py +0 -0
  219. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_rust_quality.py +0 -0
  220. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_typescript_quality.py +0 -0
  221. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_upgrade.py +0 -0
  222. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_watch.py +0 -0
  223. {hyperi_ci-2.2.2 → hyperi_ci-2.2.3}/tests/unit/test_workflow_consistency.py +0 -0
@@ -1,3 +1,12 @@
1
+ ## [2.2.3](https://github.com/hyperi-io/hyperi-ci/compare/v2.2.2...v2.2.3) (2026-05-13)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * **deployment:** exclude self-name from tier detection ([f61921b](https://github.com/hyperi-io/hyperi-ci/commit/f61921b9b0dcfe36c3c1809b0bacbedee4c78386))
7
+ * **deps:** declare typer explicitly in runtime dependencies ([895a4a6](https://github.com/hyperi-io/hyperi-ci/commit/895a4a637e2f7f55bd74e2276ddb51f9184fc7cd))
8
+ * **deps:** remove editable pylib source override to unblock Dependabot graph ([a4f1b28](https://github.com/hyperi-io/hyperi-ci/commit/a4f1b28551758e0e1287bf931f60e52194076021))
9
+
1
10
  ## [2.2.2](https://github.com/hyperi-io/hyperi-ci/compare/v2.2.1...v2.2.2) (2026-05-13)
2
11
 
3
12
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hyperi-ci
3
- Version: 2.2.2
3
+ Version: 2.2.3
4
4
  Summary: HyperI CI/CD CLI tool — multi-language build, test, and publish automation
5
5
  License: Proprietary
6
6
  License-File: LICENSE
@@ -10,3 +10,4 @@ Requires-Dist: packaging>=26.0
10
10
  Requires-Dist: pydantic>=2.13
11
11
  Requires-Dist: pyyaml>=6.0
12
12
  Requires-Dist: tomli-w>=1.2.0
13
+ Requires-Dist: typer>=0.25
@@ -0,0 +1 @@
1
+ 2.2.3
@@ -23,6 +23,11 @@ dependencies = [
23
23
  "pydantic>=2.13",
24
24
  "pyyaml>=6.0",
25
25
  "tomli-w>=1.2.0",
26
+ # typer is used directly by src/hyperi_ci/cli.py — declare
27
+ # explicitly rather than relying on the transitive pull from
28
+ # hyperi-pylib's CLI infra. If pylib ever drops typer, this
29
+ # keeps us pinned to a known surface.
30
+ "typer>=0.25",
26
31
  ]
27
32
 
28
33
  [project.scripts]
@@ -83,8 +88,20 @@ source = ["hyperi_ci"]
83
88
  # Keep this low so `pytest --cov` reports without failing the run.
84
89
  fail_under = 30
85
90
 
86
- [tool.uv.sources]
87
- hyperi-pylib = { path = "/projects/hyperi-pylib", editable = true }
91
+ # NOTE: no [tool.uv.sources] block here on purpose.
92
+ #
93
+ # Tempting to point `hyperi-pylib` at a local editable checkout
94
+ # (/projects/hyperi-pylib) so dev changes flow through `uv sync`,
95
+ # but that breaks two things:
96
+ # - Dependabot's update_graph job can't resolve the path inside its
97
+ # container — fails on every push to main, leaving the dep-graph
98
+ # stale and GitHub's vulnerability banner inaccurate.
99
+ # - Reproducibility for anyone whose checkout isn't at that exact
100
+ # path.
101
+ #
102
+ # For local pylib co-development, run from this repo:
103
+ # uv pip install -e /path/to/hyperi-pylib
104
+ # Manual install is per-developer scratch state; not in pyproject.
88
105
 
89
106
  [dependency-groups]
90
107
  dev = [
@@ -94,25 +94,91 @@ def _depends_on(manifest: Path, package_name: str) -> bool:
94
94
  dependencies = ["hyperi-pylib>=2.24"]
95
95
  dependencies = ["hyperi-pylib[metrics]>=2.24"]
96
96
 
97
- Doesn't try to parse TOML because:
97
+ **Self-match exclusion.** If the manifest declares its own package
98
+ name as ``package_name`` (i.e. this manifest IS the library, not a
99
+ consumer of it), returns False. Without this, the library's own
100
+ repo gets misdispatched as a Tier 1/2 consumer and the
101
+ deployment-artefact producer fails with "no Rust binary found" /
102
+ equivalent. The check is generic — applies to any rustlib /
103
+ pylib / future *lib and to consumer projects whose own name
104
+ happens to share a prefix.
105
+
106
+ Doesn't try to parse TOML beyond pulling the ``name`` field out of
107
+ a recognised top-level section because:
108
+
98
109
  1. Avoids hauling `tomllib` in just for tier detection.
99
110
  2. Catches every form (workspace inheritance, extras, comments)
100
111
  that a stricter parse would have to handle case by case.
101
- 3. False positives only if the package name appears in another
102
- context (e.g., a comment mentioning it) acceptable, since
103
- the consequence is "we try to invoke generate-artefacts and
104
- the binary fails clearly" rather than silent miscategorisation.
112
+ 3. False positives in the dep-match are bounded: the consequence
113
+ is "we try to invoke generate-artefacts and the binary fails
114
+ clearly" rather than silent miscategorisation.
105
115
 
106
116
  Args:
107
117
  manifest: Path to Cargo.toml or pyproject.toml.
108
118
  package_name: Dependency name to look for.
109
119
 
110
120
  Returns:
111
- True if the substring appears in the manifest's text.
121
+ True if the substring appears AND the manifest isn't itself
122
+ the named package; False otherwise.
112
123
 
113
124
  """
114
125
  try:
115
126
  text = manifest.read_text(encoding="utf-8", errors="replace")
116
127
  except OSError:
117
128
  return False
118
- return package_name in text
129
+ if package_name not in text:
130
+ return False
131
+ return _manifest_self_name(text) != package_name
132
+
133
+
134
+ # Top-level tables whose ``name`` field is the manifest's own package
135
+ # name. Listed in scan precedence — the first match wins, so a Cargo
136
+ # manifest's ``[package] name`` beats any later table (unlikely in
137
+ # Cargo, but pyproject.toml can legitimately have both ``[project]``
138
+ # and ``[tool.poetry]`` and we treat them equivalently).
139
+ _SELF_NAME_SECTIONS: frozenset[str] = frozenset(
140
+ {"[package]", "[project]", "[tool.poetry]"}
141
+ )
142
+
143
+
144
+ def _manifest_self_name(text: str) -> str | None:
145
+ """Extract the manifest's own package name, if declared.
146
+
147
+ Scans for a ``name = "..."`` (or single-quoted) line inside one of
148
+ the recognised self-name sections (:data:`_SELF_NAME_SECTIONS`).
149
+ Returns the first match. No TOML parser — line-scoped, tolerant of
150
+ extra whitespace around ``=``.
151
+
152
+ Args:
153
+ text: Full manifest text.
154
+
155
+ Returns:
156
+ The declared package name, or ``None`` if no recognised
157
+ declaration is found.
158
+
159
+ """
160
+ current_section: str | None = None
161
+ for raw in text.splitlines():
162
+ stripped = raw.strip()
163
+ if stripped.startswith("[") and stripped.endswith("]"):
164
+ current_section = stripped
165
+ continue
166
+ if current_section not in _SELF_NAME_SECTIONS:
167
+ continue
168
+ # Cheap pre-filter: skip lines that don't even start with "name".
169
+ if not stripped.startswith("name"):
170
+ continue
171
+ eq = stripped.find("=")
172
+ if eq < 0:
173
+ continue
174
+ # Confirm the LHS is exactly "name" (avoids matching "name-foo").
175
+ lhs = stripped[:eq].strip()
176
+ if lhs != "name":
177
+ continue
178
+ rhs = stripped[eq + 1 :].strip()
179
+ # Strip a trailing inline comment if present.
180
+ if "#" in rhs:
181
+ rhs = rhs[: rhs.index("#")].strip()
182
+ if len(rhs) >= 2 and rhs[0] in {'"', "'"} and rhs[-1] == rhs[0]:
183
+ return rhs[1:-1]
184
+ return None
@@ -120,6 +120,105 @@ class TestDetectTier:
120
120
  assert detect_tier(tmp_path) == Tier.PYTHON
121
121
 
122
122
 
123
+ class TestSelfMatchExclusion:
124
+ """A library's own repo is NOT a Tier 1/2 consumer of itself.
125
+
126
+ These tests cover the case where a library's Cargo.toml /
127
+ pyproject.toml has its own package name (e.g. `hyperi-rustlib`)
128
+ in the `[package]` / `[project]` table. The substring match would
129
+ otherwise misdetect the library as a consumer and dispatch the
130
+ Tier 1/2 producer, which then fails with "no binary found".
131
+ """
132
+
133
+ def test_hyperi_rustlib_own_repo_is_not_rust(self, tmp_path: Path) -> None:
134
+ # The library's own Cargo.toml has `name = "hyperi-rustlib"` in
135
+ # [package] but no `hyperi-rustlib = ...` dep line.
136
+ (tmp_path / "Cargo.toml").write_text(
137
+ '[package]\nname = "hyperi-rustlib"\nversion = "2.7.0"\n',
138
+ encoding="utf-8",
139
+ )
140
+ assert detect_tier(tmp_path) == Tier.NONE
141
+
142
+ def test_hyperi_rustlib_with_self_in_dev_deps_still_excluded(
143
+ self, tmp_path: Path
144
+ ) -> None:
145
+ # Hypothetical: library lists its own name in [dev-dependencies]
146
+ # for an example-binary workspace pattern. Still not a consumer.
147
+ (tmp_path / "Cargo.toml").write_text(
148
+ '[package]\nname = "hyperi-rustlib"\nversion = "2.7.0"\n'
149
+ '[dev-dependencies]\nhyperi-rustlib = { path = "." }\n',
150
+ encoding="utf-8",
151
+ )
152
+ assert detect_tier(tmp_path) == Tier.NONE
153
+
154
+ def test_hyperi_pylib_own_repo_is_not_python(self, tmp_path: Path) -> None:
155
+ (tmp_path / "pyproject.toml").write_text(
156
+ '[project]\nname = "hyperi-pylib"\nversion = "2.24.0"\n',
157
+ encoding="utf-8",
158
+ )
159
+ assert detect_tier(tmp_path) == Tier.NONE
160
+
161
+ def test_hyperi_pylib_poetry_section_also_excluded(self, tmp_path: Path) -> None:
162
+ # Poetry-managed projects use [tool.poetry] instead of [project].
163
+ (tmp_path / "pyproject.toml").write_text(
164
+ '[tool.poetry]\nname = "hyperi-pylib"\nversion = "2.24.0"\n',
165
+ encoding="utf-8",
166
+ )
167
+ assert detect_tier(tmp_path) == Tier.NONE
168
+
169
+ def test_single_quoted_name_excluded(self, tmp_path: Path) -> None:
170
+ # TOML allows single-quoted strings — must still match.
171
+ (tmp_path / "Cargo.toml").write_text(
172
+ "[package]\nname = 'hyperi-rustlib'\nversion = '2.7.0'\n",
173
+ encoding="utf-8",
174
+ )
175
+ assert detect_tier(tmp_path) == Tier.NONE
176
+
177
+ def test_consumer_with_real_dep_still_detected(self, tmp_path: Path) -> None:
178
+ # A real consumer has its own name AND lists the library as a dep.
179
+ # Self-match exclusion must not break this case.
180
+ (tmp_path / "Cargo.toml").write_text(
181
+ '[package]\nname = "dfe-loader"\n[dependencies]\nhyperi-rustlib = "2.5"\n',
182
+ encoding="utf-8",
183
+ )
184
+ assert detect_tier(tmp_path) == Tier.RUST
185
+
186
+ def test_consumer_with_similar_prefix_not_misdetected(self, tmp_path: Path) -> None:
187
+ # `name = "hyperi-rustlib-extras"` should NOT count as self-match
188
+ # for `hyperi-rustlib` because the full string differs. This
189
+ # consumer DOES depend on hyperi-rustlib.
190
+ (tmp_path / "Cargo.toml").write_text(
191
+ '[package]\nname = "hyperi-rustlib-extras"\n'
192
+ '[dependencies]\nhyperi-rustlib = "2.5"\n',
193
+ encoding="utf-8",
194
+ )
195
+ assert detect_tier(tmp_path) == Tier.RUST
196
+
197
+ def test_name_with_trailing_comment_handled(self, tmp_path: Path) -> None:
198
+ # Inline comments after the name field shouldn't break parsing.
199
+ (tmp_path / "Cargo.toml").write_text(
200
+ '[package]\nname = "hyperi-rustlib" # the library itself\n',
201
+ encoding="utf-8",
202
+ )
203
+ assert detect_tier(tmp_path) == Tier.NONE
204
+
205
+ def test_name_outside_recognised_section_not_self_match(
206
+ self, tmp_path: Path
207
+ ) -> None:
208
+ # A `name = "hyperi-rustlib"` in some other table (e.g.
209
+ # [features.something]) shouldn't count as the manifest's own
210
+ # name. We only treat [package] / [project] / [tool.poetry] as
211
+ # self-name sections.
212
+ (tmp_path / "Cargo.toml").write_text(
213
+ '[package]\nname = "consumer-app"\n'
214
+ "[features.weird]\n"
215
+ 'name = "hyperi-rustlib"\n'
216
+ '[dependencies]\nhyperi-rustlib = "2.5"\n',
217
+ encoding="utf-8",
218
+ )
219
+ assert detect_tier(tmp_path) == Tier.RUST
220
+
221
+
123
222
  class TestTierEnum:
124
223
  """`Tier` enum has the four values expected by callers."""
125
224
 
@@ -20,115 +20,6 @@ wheels = [
20
20
  { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" },
21
21
  ]
22
22
 
23
- [[package]]
24
- name = "anyio"
25
- version = "4.13.0"
26
- source = { registry = "https://pypi.org/simple" }
27
- dependencies = [
28
- { name = "idna" },
29
- { name = "typing-extensions", marker = "python_full_version < '3.13'" },
30
- ]
31
- sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" }
32
- wheels = [
33
- { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" },
34
- ]
35
-
36
- [[package]]
37
- name = "asyncer"
38
- version = "0.0.17"
39
- source = { registry = "https://pypi.org/simple" }
40
- dependencies = [
41
- { name = "anyio" },
42
- { name = "sniffio" },
43
- { name = "typing-extensions", marker = "python_full_version < '3.15'" },
44
- ]
45
- sdist = { url = "https://files.pythonhosted.org/packages/d2/4c/62b6044679e08788322bbd0dee5b487a6f7f60bb4e2bd45617ff0d94d1e3/asyncer-0.0.17.tar.gz", hash = "sha256:8a41e185e7ec2ecd583c269d72907a0f9f832e744b6c7474aeb21e349c4becf4", size = 19516, upload-time = "2026-02-21T16:35:54.068Z" }
46
- wheels = [
47
- { url = "https://files.pythonhosted.org/packages/2a/c5/b72735a095b4b3170b34150e89314a40dd0450d0eb6746b331cb664479d1/asyncer-0.0.17-py3-none-any.whl", hash = "sha256:b0055950e094fb84fd8d21611c7e7b6f5715ddcb57c522c058f64c20badd1438", size = 9252, upload-time = "2026-02-21T16:35:55.022Z" },
48
- ]
49
-
50
- [[package]]
51
- name = "certifi"
52
- version = "2026.4.22"
53
- source = { registry = "https://pypi.org/simple" }
54
- sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" }
55
- wheels = [
56
- { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" },
57
- ]
58
-
59
- [[package]]
60
- name = "charset-normalizer"
61
- version = "3.4.7"
62
- source = { registry = "https://pypi.org/simple" }
63
- sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" }
64
- wheels = [
65
- { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" },
66
- { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" },
67
- { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" },
68
- { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" },
69
- { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" },
70
- { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" },
71
- { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" },
72
- { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" },
73
- { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" },
74
- { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" },
75
- { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" },
76
- { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" },
77
- { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" },
78
- { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" },
79
- { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" },
80
- { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" },
81
- { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" },
82
- { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" },
83
- { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" },
84
- { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" },
85
- { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" },
86
- { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" },
87
- { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" },
88
- { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" },
89
- { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" },
90
- { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" },
91
- { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" },
92
- { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" },
93
- { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" },
94
- { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" },
95
- { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" },
96
- { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" },
97
- { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" },
98
- { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" },
99
- { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" },
100
- { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" },
101
- { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" },
102
- { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" },
103
- { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" },
104
- { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" },
105
- { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" },
106
- { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" },
107
- { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" },
108
- { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" },
109
- { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" },
110
- { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" },
111
- { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" },
112
- { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" },
113
- { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" },
114
- { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" },
115
- { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" },
116
- { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" },
117
- { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" },
118
- { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" },
119
- { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" },
120
- { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" },
121
- { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" },
122
- { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" },
123
- { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" },
124
- { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" },
125
- { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" },
126
- { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" },
127
- { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" },
128
- { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" },
129
- { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" },
130
- ]
131
-
132
23
  [[package]]
133
24
  name = "click"
134
25
  version = "8.3.3"
@@ -234,19 +125,6 @@ wheels = [
234
125
  { url = "https://files.pythonhosted.org/packages/61/e8/cb8e80d6f9f55b99588625062822bf946cf03ed06315df4bd8397f5632a1/coverage-7.14.0-py3-none-any.whl", hash = "sha256:8de5b61163aee3d05c8a2beab6f47913df7981dad1baf82c414d99158c286ab1", size = 211764, upload-time = "2026-05-10T18:02:29.538Z" },
235
126
  ]
236
127
 
237
- [[package]]
238
- name = "detect-secrets"
239
- version = "1.5.0"
240
- source = { registry = "https://pypi.org/simple" }
241
- dependencies = [
242
- { name = "pyyaml" },
243
- { name = "requests" },
244
- ]
245
- sdist = { url = "https://files.pythonhosted.org/packages/69/67/382a863fff94eae5a0cf05542179169a1c49a4c8784a9480621e2066ca7d/detect_secrets-1.5.0.tar.gz", hash = "sha256:6bb46dcc553c10df51475641bb30fd69d25645cc12339e46c824c1e0c388898a", size = 97351, upload-time = "2024-05-06T17:46:19.721Z" }
246
- wheels = [
247
- { url = "https://files.pythonhosted.org/packages/4e/5e/4f5fe4b89fde1dc3ed0eb51bd4ce4c0bca406246673d370ea2ad0c58d747/detect_secrets-1.5.0-py3-none-any.whl", hash = "sha256:e24e7b9b5a35048c313e983f76c4bd09dad89f045ff059e354f9943bf45aa060", size = 120341, upload-time = "2024-05-06T17:46:16.628Z" },
248
- ]
249
-
250
128
  [[package]]
251
129
  name = "dulwich"
252
130
  version = "1.2.1"
@@ -305,6 +183,7 @@ dependencies = [
305
183
  { name = "pydantic" },
306
184
  { name = "pyyaml" },
307
185
  { name = "tomli-w" },
186
+ { name = "typer" },
308
187
  ]
309
188
 
310
189
  [package.dev-dependencies]
@@ -317,11 +196,12 @@ dev = [
317
196
 
318
197
  [package.metadata]
319
198
  requires-dist = [
320
- { name = "hyperi-pylib", extras = ["metrics"], editable = "/projects/hyperi-pylib" },
199
+ { name = "hyperi-pylib", extras = ["metrics"], specifier = ">=2.28.0" },
321
200
  { name = "packaging", specifier = ">=26.0" },
322
201
  { name = "pydantic", specifier = ">=2.13" },
323
202
  { name = "pyyaml", specifier = ">=6.0" },
324
203
  { name = "tomli-w", specifier = ">=1.2.0" },
204
+ { name = "typer", specifier = ">=0.25" },
325
205
  ]
326
206
 
327
207
  [package.metadata.requires-dev]
@@ -334,12 +214,9 @@ dev = [
334
214
 
335
215
  [[package]]
336
216
  name = "hyperi-pylib"
337
- version = "2.27.2"
338
- source = { editable = "/projects/hyperi-pylib" }
217
+ version = "2.28.0"
218
+ source = { registry = "https://pypi.org/simple" }
339
219
  dependencies = [
340
- { name = "anyio" },
341
- { name = "asyncer" },
342
- { name = "detect-secrets" },
343
220
  { name = "dulwich" },
344
221
  { name = "dynaconf" },
345
222
  { name = "loguru" },
@@ -349,6 +226,10 @@ dependencies = [
349
226
  { name = "tomli-w" },
350
227
  { name = "typer" },
351
228
  ]
229
+ sdist = { url = "https://files.pythonhosted.org/packages/35/37/a14ce0980cf87eb2e90a9b08b19a43f2892394d9c6be6f8b581452e63e90/hyperi_pylib-2.28.0.tar.gz", hash = "sha256:2a38f9e7edc86eb995e4b6928a624d85f20f7926463b9cee7a65dab2b3d3ab37", size = 228502, upload-time = "2026-05-01T03:59:10.723Z" }
230
+ wheels = [
231
+ { url = "https://files.pythonhosted.org/packages/34/c6/cf762491dc45c6182b097290e43e05724837ef35793c80672dfc06e60466/hyperi_pylib-2.28.0-py3-none-any.whl", hash = "sha256:0a451725cfed783de25988bda116ccb30ca178d5860030c35b28f3c46afe0a0e", size = 279895, upload-time = "2026-05-01T03:59:11.897Z" },
232
+ ]
352
233
 
353
234
  [package.optional-dependencies]
354
235
  metrics = [
@@ -356,102 +237,6 @@ metrics = [
356
237
  { name = "psutil" },
357
238
  ]
358
239
 
359
- [package.metadata]
360
- requires-dist = [
361
- { name = "aiobotocore", marker = "extra == 'dev'", specifier = ">=3.6.0" },
362
- { name = "aiobotocore", marker = "extra == 'secrets'", specifier = ">=3.6.0" },
363
- { name = "aiobotocore", marker = "extra == 'secrets-aws'", specifier = ">=3.6.0" },
364
- { name = "ansible-vault", marker = "extra == 'dev'", specifier = ">=4.0.0" },
365
- { name = "ansible-vault", marker = "extra == 'secrets'", specifier = ">=4.0.0" },
366
- { name = "ansible-vault", marker = "extra == 'secrets-ansible-vault'", specifier = ">=4.0.0" },
367
- { name = "anyio", specifier = ">=4.13.0" },
368
- { name = "asyncer", specifier = ">=0.0.17" },
369
- { name = "azure-identity", marker = "extra == 'secrets'", specifier = ">=1.25.1" },
370
- { name = "azure-identity", marker = "extra == 'secrets-azure'", specifier = ">=1.25.1" },
371
- { name = "azure-keyvault-secrets", marker = "extra == 'secrets'", specifier = ">=4.11.0" },
372
- { name = "azure-keyvault-secrets", marker = "extra == 'secrets-azure'", specifier = ">=4.11.0" },
373
- { name = "bandit", extras = ["toml"], marker = "extra == 'dev'", specifier = ">=1.7.0" },
374
- { name = "boto3", marker = "extra == 'dev'", specifier = ">=1.43.0" },
375
- { name = "boto3", marker = "extra == 'secrets'", specifier = ">=1.43.0" },
376
- { name = "boto3", marker = "extra == 'secrets-aws'", specifier = ">=1.43.0" },
377
- { name = "cashews", marker = "extra == 'cache'", specifier = ">=7.5.0" },
378
- { name = "common-expression-language", marker = "extra == 'expression'", specifier = ">=0.5.6" },
379
- { name = "confluent-kafka", marker = "extra == 'kafka'", specifier = ">=2.14.0" },
380
- { name = "cryptography", marker = "extra == 'dev'", specifier = ">=48.0.0" },
381
- { name = "cryptography", marker = "extra == 'license'", specifier = ">=48.0.0" },
382
- { name = "datafog", marker = "extra == 'pii'", specifier = ">=4.4.0" },
383
- { name = "datafog", extras = ["nlp"], marker = "extra == 'pii-ner'", specifier = ">=4.4.0" },
384
- { name = "detect-secrets", specifier = ">=1.5.0" },
385
- { name = "dulwich", specifier = ">=1.2.0" },
386
- { name = "dynaconf", specifier = ">=3.2.13" },
387
- { name = "faker", marker = "extra == 'dev'", specifier = ">=40.0.0" },
388
- { name = "genson", marker = "extra == 'kafka'", specifier = ">=1.3.0" },
389
- { name = "google-cloud-secret-manager", marker = "extra == 'secrets'", specifier = ">=2.28.0" },
390
- { name = "google-cloud-secret-manager", marker = "extra == 'secrets-gcp'", specifier = ">=2.28.0" },
391
- { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.28.0" },
392
- { name = "httpx", marker = "extra == 'http'", specifier = ">=0.28.0" },
393
- { name = "httpx", marker = "extra == 'license'", specifier = ">=0.28.0" },
394
- { name = "loguru", specifier = ">=0.7.3" },
395
- { name = "mergedeep", specifier = ">=1.3.4" },
396
- { name = "mergedeep", marker = "extra == 'dev'", specifier = ">=1.3.4" },
397
- { name = "moto", extras = ["secretsmanager"], marker = "extra == 'dev'", specifier = ">=5.2.0" },
398
- { name = "msgpack", marker = "extra == 'cache'", specifier = ">=1.1.0" },
399
- { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.0.0" },
400
- { name = "myst-parser", marker = "extra == 'docs'", specifier = ">=5.0.0" },
401
- { name = "opentelemetry-api", marker = "extra == 'opentelemetry'", specifier = ">=1.41.0" },
402
- { name = "opentelemetry-exporter-otlp", marker = "extra == 'opentelemetry'", specifier = ">=1.41.0" },
403
- { name = "opentelemetry-exporter-prometheus", marker = "extra == 'opentelemetry'", specifier = ">=0.62b0" },
404
- { name = "opentelemetry-sdk", marker = "extra == 'opentelemetry'", specifier = ">=1.41.0" },
405
- { name = "pip-audit", marker = "extra == 'dev'", specifier = ">=2.6.0" },
406
- { name = "pre-commit", marker = "extra == 'dev'", specifier = ">=4.6.0" },
407
- { name = "presidio-analyzer", marker = "extra == 'presidio'", specifier = ">=2.2.362" },
408
- { name = "presidio-anonymizer", marker = "extra == 'presidio'", specifier = ">=2.2.362" },
409
- { name = "prometheus-client", marker = "extra == 'metrics'", specifier = ">=0.25.0" },
410
- { name = "psutil", marker = "extra == 'metrics'", specifier = ">=7.2.0" },
411
- { name = "psycopg", extras = ["binary", "pool"], marker = "extra == 'cache'", specifier = ">=3.3.0" },
412
- { name = "purgatory", marker = "extra == 'http'", specifier = ">=3.0.1" },
413
- { name = "purgatory", marker = "extra == 'resilience'", specifier = ">=3.0.1" },
414
- { name = "pycryptodomex", marker = "extra == 'dev'", specifier = ">=3.20.0" },
415
- { name = "pydantic", marker = "extra == 'deployment'", specifier = ">=2.13.0" },
416
- { name = "pydantic", marker = "extra == 'dev'", specifier = ">=2.13.0" },
417
- { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" },
418
- { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.23.0" },
419
- { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=7.0.0" },
420
- { name = "pytest-httpx", marker = "extra == 'dev'", specifier = ">=0.36.0" },
421
- { name = "python-dotenv", specifier = ">=1.0.0" },
422
- { name = "pyyaml", specifier = ">=6.0.3" },
423
- { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.15.0" },
424
- { name = "sphinx", marker = "extra == 'docs'", specifier = ">=8.0.0,<10" },
425
- { name = "sphinx-autobuild", marker = "extra == 'docs'", specifier = ">=2024.0.0" },
426
- { name = "sphinx-rtd-theme", marker = "extra == 'docs'", specifier = ">=3.0.0" },
427
- { name = "stamina", marker = "extra == 'dev'", specifier = ">=26.1.0" },
428
- { name = "stamina", marker = "extra == 'http'", specifier = ">=26.1.0" },
429
- { name = "stamina", marker = "extra == 'resilience'", specifier = ">=26.1.0" },
430
- { name = "tiktoken", marker = "extra == 'dev'", specifier = ">=0.5.0" },
431
- { name = "tomli-w", specifier = ">=1.0.0" },
432
- { name = "ty", marker = "extra == 'dev'", specifier = ">=0.0.34" },
433
- { name = "typer", specifier = ">=0.25.0" },
434
- { name = "vulture", marker = "extra == 'dev'", specifier = ">=2.16" },
435
- ]
436
- provides-extras = ["cli", "resilience", "http", "cache", "metrics", "opentelemetry", "expression", "deployment", "database", "kafka", "pii", "pii-ner", "presidio", "secrets-ansible-vault", "secrets-vault", "secrets-aws", "secrets-gcp", "secrets-azure", "secrets", "license", "version-check", "enhanced", "dev", "docs"]
437
-
438
- [package.metadata.requires-dev]
439
- dev = [
440
- { name = "azure-identity", specifier = ">=1.25.1" },
441
- { name = "azure-keyvault-secrets", specifier = ">=4.9.0" },
442
- { name = "fastapi", specifier = ">=0.115.0" },
443
- { name = "google-cloud-secret-manager", specifier = ">=2.26.0" },
444
- ]
445
-
446
- [[package]]
447
- name = "idna"
448
- version = "3.15"
449
- source = { registry = "https://pypi.org/simple" }
450
- sdist = { url = "https://files.pythonhosted.org/packages/82/77/7b3966d0b9d1d31a36ddf1746926a11dface89a83409bf1483f0237aa758/idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc", size = 199245, upload-time = "2026-05-12T22:45:57.011Z" }
451
- wheels = [
452
- { url = "https://files.pythonhosted.org/packages/d2/23/408243171aa9aaba178d3e2559159c24c1171a641aa83b67bdd3394ead8e/idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8", size = 72340, upload-time = "2026-05-12T22:45:55.733Z" },
453
- ]
454
-
455
240
  [[package]]
456
241
  name = "iniconfig"
457
242
  version = "2.3.0"
@@ -743,21 +528,6 @@ wheels = [
743
528
  { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" },
744
529
  ]
745
530
 
746
- [[package]]
747
- name = "requests"
748
- version = "2.34.0"
749
- source = { registry = "https://pypi.org/simple" }
750
- dependencies = [
751
- { name = "certifi" },
752
- { name = "charset-normalizer" },
753
- { name = "idna" },
754
- { name = "urllib3" },
755
- ]
756
- sdist = { url = "https://files.pythonhosted.org/packages/43/b8/7a707d60fea4c49094e40262cc0e2ca6c768cca21587e34d3f705afec47e/requests-2.34.0.tar.gz", hash = "sha256:7d62fe92f50eb82c529b0916bb445afa1531a566fc8f35ffdc64446e771b856a", size = 142436, upload-time = "2026-05-11T19:29:51.717Z" }
757
- wheels = [
758
- { url = "https://files.pythonhosted.org/packages/ef/e6/e300fce5fe83c30520607a015dabd985df3251e188d234bfe9492e17a389/requests-2.34.0-py3-none-any.whl", hash = "sha256:917520a21b767485ce7c588f4ebb917c436b24a31231b44228715eaeb5a52c60", size = 73021, upload-time = "2026-05-11T19:29:49.923Z" },
759
- ]
760
-
761
531
  [[package]]
762
532
  name = "rich"
763
533
  version = "15.0.0"
@@ -805,15 +575,6 @@ wheels = [
805
575
  { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" },
806
576
  ]
807
577
 
808
- [[package]]
809
- name = "sniffio"
810
- version = "1.3.1"
811
- source = { registry = "https://pypi.org/simple" }
812
- sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" }
813
- wheels = [
814
- { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" },
815
- ]
816
-
817
578
  [[package]]
818
579
  name = "tomli-w"
819
580
  version = "1.2.0"
hyperi_ci-2.2.2/VERSION DELETED
@@ -1 +0,0 @@
1
- 2.2.2