tuner-testkit 4.0.2__tar.gz → 4.1.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 (199) hide show
  1. tuner_testkit-4.1.0/PKG-INFO +213 -0
  2. tuner_testkit-4.1.0/README.md +168 -0
  3. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/pyproject.toml +6 -17
  4. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/__init__.py +1 -1
  5. tuner_testkit-4.1.0/tuner_testkit.egg-info/PKG-INFO +213 -0
  6. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit.egg-info/requires.txt +4 -16
  7. tuner_testkit-4.0.2/PKG-INFO +0 -176
  8. tuner_testkit-4.0.2/README.md +0 -118
  9. tuner_testkit-4.0.2/tuner_testkit.egg-info/PKG-INFO +0 -176
  10. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/LICENSE +0 -0
  11. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/setup.cfg +0 -0
  12. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/__init__.py +0 -0
  13. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/__main__.py +0 -0
  14. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/__init__.py +0 -0
  15. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/api.py +0 -0
  16. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/db.py +0 -0
  17. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/generators.py +0 -0
  18. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/ids.py +0 -0
  19. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/_internal/wait.py +0 -0
  20. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/base.py +0 -0
  21. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/context.py +0 -0
  22. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/plane.py +0 -0
  23. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/action_words/registry.py +0 -0
  24. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/__init__.py +0 -0
  25. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/app.py +0 -0
  26. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/errors.py +0 -0
  27. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/router.py +0 -0
  28. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/spec.py +0 -0
  29. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_mock/store.py +0 -0
  30. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/__init__.py +0 -0
  31. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/auth.py +0 -0
  32. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/__init__.py +0 -0
  33. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/capture.py +0 -0
  34. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/codegen.py +0 -0
  35. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/freeze.py +0 -0
  36. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/mocks.py +0 -0
  37. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/normalize.py +0 -0
  38. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/pipeline.py +0 -0
  39. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_objects/recording/sanitize.py +0 -0
  40. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_test/__init__.py +0 -0
  41. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_test/client.py +0 -0
  42. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_test/errors.py +0 -0
  43. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_test/jsonpath.py +0 -0
  44. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/api_test/model.py +0 -0
  45. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/__init__.py +0 -0
  46. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/__init__.py +0 -0
  47. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/changelog.py +0 -0
  48. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/plane.py +0 -0
  49. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/plane_app.py +0 -0
  50. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/plane_asset.py +0 -0
  51. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/tests/test_plane_asset.py +0 -0
  52. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/_shared/tests/test_plane_collect.py +0 -0
  53. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/__init__.py +0 -0
  54. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/__main__.py +0 -0
  55. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/addon.py +0 -0
  56. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/cli.py +0 -0
  57. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/playwright_tap.py +0 -0
  58. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/tests/__init__.py +0 -0
  59. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/api_recorder/tests/test_addon.py +0 -0
  60. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/__init__.py +0 -0
  61. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/__main__.py +0 -0
  62. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/build.py +0 -0
  63. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/cli.py +0 -0
  64. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/agents/bdd-asset-pipeline.md +0 -0
  65. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks/sync_registry.py +0 -0
  66. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/hooks.json +0 -0
  67. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-authoring.mdc +0 -0
  68. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/apps-handover.mdc +0 -0
  69. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/assets-knowledge.mdc +0 -0
  70. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-asset-layering.mdc +0 -0
  71. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-pipeline-gates.mdc +0 -0
  72. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/bdd-stage-layout.mdc +0 -0
  73. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/commit-convention.mdc +0 -0
  74. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/index-hygiene.mdc +0 -0
  75. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-db.mdc +0 -0
  76. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-fake.mdc +0 -0
  77. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-logging.mdc +0 -0
  78. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/rules/packages-page-test.mdc +0 -0
  79. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-action-word/SKILL.md +0 -0
  80. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/create-app/SKILL.md +0 -0
  81. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/dump-ddl/SKILL.md +0 -0
  82. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-authoring/SKILL.md +0 -0
  83. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/feature-review-lint/SKILL.md +0 -0
  84. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/freeze-api-objects/SKILL.md +0 -0
  85. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-behave-steps/SKILL.md +0 -0
  86. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-index/SKILL.md +0 -0
  87. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/maintain-page-objects/SKILL.md +0 -0
  88. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/release-template/SKILL.md +0 -0
  89. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/reuse-analysis/SKILL.md +0 -0
  90. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/.cursor/skills/run-feature-playwright-mcp/SKILL.md +0 -0
  91. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/AGENTS.md +0 -0
  92. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/MANIFEST.txt +0 -0
  93. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/action-words-syntax.md +0 -0
  94. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/api-objects-syntax.md +0 -0
  95. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/apps-authoring-syntax.md +0 -0
  96. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/assets-knowledge-syntax.md +0 -0
  97. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/bdd-run-gherkin-in-playwrightMCP.md +0 -0
  98. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-gerkin-syntax.md +0 -0
  99. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/behave-step-definitions.md +0 -0
  100. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/commit-convention.md +0 -0
  101. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/docs/spec/page-objects-syntax.md +0 -0
  102. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/README.md +0 -0
  103. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/commit-msg +0 -0
  104. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/pre-push +0 -0
  105. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/dna_payload/tools/git-hooks/validate_commit_msg.py +0 -0
  106. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/paths.py +0 -0
  107. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/source.py +0 -0
  108. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dna/tests/test_cli.py +0 -0
  109. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/dump_ddl.py +0 -0
  110. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_ai/__init__.py +0 -0
  111. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_ai/__main__.py +0 -0
  112. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_ai/registry.py +0 -0
  113. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/__init__.py +0 -0
  114. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/__main__.py +0 -0
  115. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/build.py +0 -0
  116. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/catalog.py +0 -0
  117. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/plane.py +0 -0
  118. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/index_platform/tests/test_catalog.py +0 -0
  119. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/__init__.py +0 -0
  120. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/__main__.py +0 -0
  121. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/manifest.py +0 -0
  122. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/scaffold.py +0 -0
  123. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/apps/__init__.py +0 -0
  124. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/behave.ini +0 -0
  125. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/config/env.py +0 -0
  126. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/__init__.py +0 -0
  127. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/__init__.py +0 -0
  128. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/__init__.py +0 -0
  129. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/_internal/params.py +0 -0
  130. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/action_words/models.py +0 -0
  131. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/__init__.py +0 -0
  132. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/auth.py +0 -0
  133. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/plane.py +0 -0
  134. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/recording/__init__.py +0 -0
  135. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/api_objects/registry.py +0 -0
  136. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/__init__.py +0 -0
  137. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/plane.py +0 -0
  138. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/stubs/packages/page_objects/session.py +0 -0
  139. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/init_repo/tests/test_scaffold.py +0 -0
  140. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/mock_server/__init__.py +0 -0
  141. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/mock_server/__main__.py +0 -0
  142. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/mock_server/cli.py +0 -0
  143. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/mock_server/plane.py +0 -0
  144. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/mock_server/seed.py +0 -0
  145. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/__init__.py +0 -0
  146. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/__main__.py +0 -0
  147. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/capture.py +0 -0
  148. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/cli.py +0 -0
  149. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/codegen.py +0 -0
  150. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/freeze.py +0 -0
  151. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/inject.py +0 -0
  152. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/session.py +0 -0
  153. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/tests/__init__.py +0 -0
  154. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/tests/test_capture.py +0 -0
  155. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/tests/test_cli.py +0 -0
  156. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/page_recorder/tests/test_freeze.py +0 -0
  157. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/recorder/__init__.py +0 -0
  158. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/recorder/__main__.py +0 -0
  159. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/recorder/cli.py +0 -0
  160. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/recorder/tests/__init__.py +0 -0
  161. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/apps/recorder/tests/test_cli.py +0 -0
  162. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/config.py +0 -0
  163. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/db/__init__.py +0 -0
  164. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/db/client.py +0 -0
  165. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/db/connection.py +0 -0
  166. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/excel/__init__.py +0 -0
  167. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/excel/workbook.py +0 -0
  168. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/__init__.py +0 -0
  169. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/__main__.py +0 -0
  170. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/catalog.py +0 -0
  171. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/china.py +0 -0
  172. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/cli.py +0 -0
  173. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/core.py +0 -0
  174. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/medical.py +0 -0
  175. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/fake/wrappers.py +0 -0
  176. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/__init__.py +0 -0
  177. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/context.py +0 -0
  178. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/core.py +0 -0
  179. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/helpers.py +0 -0
  180. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/hooks.py +0 -0
  181. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/logging/scenario_file.py +0 -0
  182. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/__init__.py +0 -0
  183. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/__main__.py +0 -0
  184. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/base.py +0 -0
  185. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/driver.py +0 -0
  186. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/errors.py +0 -0
  187. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/harvest.py +0 -0
  188. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/health.py +0 -0
  189. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/locator.py +0 -0
  190. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/model.py +0 -0
  191. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/registry.py +0 -0
  192. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/session.py +0 -0
  193. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/steps.py +0 -0
  194. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/page_test/testing.py +0 -0
  195. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit/project.py +0 -0
  196. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit.egg-info/SOURCES.txt +0 -0
  197. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit.egg-info/dependency_links.txt +0 -0
  198. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit.egg-info/entry_points.txt +0 -0
  199. {tuner_testkit-4.0.2 → tuner_testkit-4.1.0}/tuner_testkit.egg-info/top_level.txt +0 -0
@@ -0,0 +1,213 @@
1
+ Metadata-Version: 2.4
2
+ Name: tuner-testkit
3
+ Version: 4.1.0
4
+ Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
5
+ Author: tuner-testkit contributors
6
+ License-Expression: MIT
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: pydantic>=2
11
+ Provides-Extra: db
12
+ Requires-Dist: pymysql>=1.2.0; extra == "db"
13
+ Requires-Dist: pymssql>=2.3.0; extra == "db"
14
+ Requires-Dist: psycopg[binary]>=3.2; extra == "db"
15
+ Requires-Dist: sqlalchemy>=2.0; extra == "db"
16
+ Provides-Extra: api
17
+ Requires-Dist: requests>=2.33.1; extra == "api"
18
+ Provides-Extra: web-ui
19
+ Requires-Dist: playwright>=1.54.0; extra == "web-ui"
20
+ Provides-Extra: phone-ui
21
+ Provides-Extra: excel
22
+ Requires-Dist: openpyxl>=3.1.0; extra == "excel"
23
+ Provides-Extra: fake
24
+ Requires-Dist: faker>=37.0.0; extra == "fake"
25
+ Provides-Extra: mock
26
+ Requires-Dist: fastapi>=0.115.0; extra == "mock"
27
+ Requires-Dist: uvicorn[standard]>=0.32.0; extra == "mock"
28
+ Requires-Dist: httpx>=0.28.0; extra == "mock"
29
+ Provides-Extra: recorder
30
+ Requires-Dist: playwright>=1.54.0; extra == "recorder"
31
+ Requires-Dist: mitmproxy>=11.1.3; extra == "recorder"
32
+ Provides-Extra: test
33
+ Requires-Dist: pytest>=9.0.3; extra == "test"
34
+ Requires-Dist: openpyxl>=3.1.0; extra == "test"
35
+ Requires-Dist: httpx>=0.28.0; extra == "test"
36
+ Provides-Extra: bdd
37
+ Requires-Dist: behave>=1.2.6; extra == "bdd"
38
+ Requires-Dist: playwright>=1.54.0; extra == "bdd"
39
+ Requires-Dist: behave-html-pretty-formatter>=1.16.1; extra == "bdd"
40
+ Provides-Extra: all
41
+ Requires-Dist: tuner-testkit[api,bdd,db,excel,fake,mock,phone-ui,recorder,test,web-ui]; extra == "all"
42
+ Provides-Extra: dev
43
+ Requires-Dist: tuner-testkit[all]; extra == "dev"
44
+ Dynamic: license-file
45
+
46
+ # tuner-testkit
47
+
48
+ 发行名 **`tuner-testkit`**,导入名 **`tuner_testkit`**。给被测系统(SUT)测试仓提供公共运行库与 CLI(db / API / Web UI / 录制 / mock),以及 Cursor/git **DNA**(rules、skills、hooks)。
49
+
50
+ 业务资产(page/api objects、action words、features)留在**各项目仓**的 `packages/` 与 `tests/`,不进本包。平台发新版本后,下游用 `uv` 按需升级,不必再整树拷贝运行库。
51
+
52
+ ---
53
+
54
+ ## 标准作业流程
55
+
56
+ ### 1. 工具域:只装核心 kit(能 `tuner-init` 即可)
57
+
58
+ `uv tool install` 和业务仓 `.venv` 是两套环境。下游在 **tool 域只装默认 wheel**,用来拿 `tuner-init` / `tuner-dna`;**不要**在 tool 域打开 `[db]` / `[api]` 等 extra。
59
+
60
+ ```bash
61
+ uv tool install tuner-testkit
62
+ ```
63
+
64
+ 入口命令是 `tuner-init`、`tuner-dna` 等(`tuner-*`),**没有** `tuner-testkit` 这个 script。`tuner-dump-ddl`、`tuner-recorder` 等依赖 extra 的 CLI,请在业务仓用 `uv run …` 跑,走该仓 `.venv`。
65
+
66
+ ### 2. 初始化测试仓
67
+
68
+ ```bash
69
+ tuner-init scaffold ../my-sut-tests
70
+ cd ../my-sut-tests
71
+ uv sync
72
+ ```
73
+
74
+ `scaffold` 会铺六层目录、写入依赖 `tuner-testkit[db,api]` 的 `pyproject.toml`,并执行一次 `tuner-dna sync`(把 `.cursor/`、`docs/spec/`、`tools/git-hooks/` 放进**项目树**)。可在任意目录运行,不必先有测试仓。不要用 `tuner-testkit init repo`。
75
+
76
+ `uv sync` 把 **db / api 装进业务仓 `.venv`**,不是 tool 域。已有项目仓则在该仓根目录:
77
+
78
+ ```bash
79
+ uv add "tuner-testkit[db,api]>=4.0.0"
80
+ uv sync
81
+ ```
82
+
83
+ Web UI / 合录等按需再加 extra:
84
+
85
+ ```bash
86
+ uv add "tuner-testkit[web-ui]"
87
+ uv add "tuner-testkit[recorder]"
88
+ ```
89
+
90
+ 测 kit 全能力(平台狗食仓等)一次打开全部能力 extra:
91
+
92
+ ```bash
93
+ uv add "tuner-testkit[all]"
94
+ uv sync
95
+ ```
96
+
97
+ ### 3. 开始写业务
98
+
99
+ 在**项目仓**里写,不要改 site-packages 里的 kit:
100
+
101
+ | 你写什么 | 放哪里 |
102
+ | --- | --- |
103
+ | 页面 / 接口资产 | `packages/page_objects/`、`packages/api_objects/` |
104
+ | 业务动作 | `packages/action_words/` |
105
+ | BDD / pytest | `tests/features/`、`tests/pytest/` |
106
+ | 知识(DDL、用例) | `assets/` |
107
+ | 本仓私有工具 | `apps/`(`python -m apps.<name>`) |
108
+
109
+ 代码里 `from tuner_testkit.db import …` / `from tuner_testkit.page_test import …`。密钥只放本机 `config/env_local.py` 或环境变量(`TUNER_ENV`、`TUNER_DB_<ALIAS>_*`),**不要提交**。
110
+
111
+ 录制产物同样写到项目仓 `packages/`,不会写进 venv。
112
+
113
+ ### 4. 获取 PyPI 上的更新
114
+
115
+ 平台发新版本后,下游从 [PyPI:tuner-testkit](https://pypi.org/project/tuner-testkit/) 取 wheel,**不要**再拷本仓源码。tool 域和业务仓 `.venv` 是两份安装,**两边都要升**,再铺 DNA。
116
+
117
+ **先看当前装的是哪一版、PyPI 最新是哪一版:**
118
+
119
+ ```bash
120
+ uv tool list # tool 域里的 tuner-testkit
121
+ cd ../my-sut-tests
122
+ uv pip show tuner-testkit # 业务仓 .venv
123
+ ```
124
+
125
+ 发行说明见 [`docs/changelog/FRAMEWORK.md`](docs/changelog/FRAMEWORK.md) 与该版本的 `docs/changelog/TEMPLATE-*.md`。
126
+
127
+ **① tool 域(只升核心 CLI)**
128
+
129
+ ```bash
130
+ uv tool upgrade tuner-testkit
131
+ ```
132
+
133
+ 升的是 `tuner-init` / `tuner-dna` 所在环境。这里仍然**不要**加 `[db]` / `[api]`。尚未 `uv tool install` 过则先执行第 1 节。
134
+
135
+ **② 业务仓 `.venv`(升运行库 + extras)**
136
+
137
+ 在**项目仓根目录**改依赖并同步 lock。保留你原来打开的 extra(普通仓 `[db,api]`,狗食/全能力仓 `[all]`):
138
+
139
+ ```bash
140
+ # 钉到某一发行版(推荐,和团队 lock 一致)
141
+ uv add "tuner-testkit[db,api]==4.1.0"
142
+
143
+ # 或只抬下限,让解析器选允许范围内的最新
144
+ # uv add "tuner-testkit[db,api]>=4.1.0"
145
+
146
+ uv sync
147
+ ```
148
+
149
+ 已经写过 `>=4.0.0`、只想把 lock 里的 kit 升到 PyPI 最新:
150
+
151
+ ```bash
152
+ uv lock --upgrade-package tuner-testkit
153
+ uv sync
154
+ ```
155
+
156
+ 只改 `pyproject.toml` 里的版本再 `uv lock` / `uv sync` 也可以。一个 wheel 不能「只升 web-ui、钉死旧 db」。
157
+
158
+ **③ 同步 DNA 并提交**
159
+
160
+ `uv add` / `uv sync` 只更新 site-packages 里的运行库。Cursor 读的是项目树里的 `.cursor/`、`docs/spec/`、`tools/git-hooks/`,必须再铺一层:
161
+
162
+ ```bash
163
+ tuner-dna sync
164
+ tuner-dna check
165
+ git add -A && git commit
166
+ ```
167
+
168
+ `tuner-dna check` 核对项目树 DNA 是否与**当前 PATH 上那份** kit 一致。建议先 `uv tool upgrade`,再 `sync`,避免 CLI 还是旧包、`.venv` 已是新包。
169
+
170
+ 新仓第一次仍用第 2 节的 `tuner-init scaffold`(会写依赖并做一次 `tuner-dna sync`),不是每次发版都重新 scaffold。
171
+
172
+ `[phone-ui]` 为预留空 extra,4.0 未实现。
173
+
174
+ ---
175
+
176
+ ## extras
177
+
178
+ | extra | 内容 |
179
+ | --- | --- |
180
+ | (默认 wheel) | `config` / `logging`、`tuner-init`、`tuner-dna`(tool 域只装这个) |
181
+ | `[db]` | MySQL / SQL Server / PostgreSQL(装在业务仓 `.venv`) |
182
+ | `[api]` | `api_test`(HTTP 客户端) |
183
+ | `[web-ui]` | `page_test` + Playwright |
184
+ | `[phone-ui]` | 预留,无实现 |
185
+ | `[recorder]` | 合录 / 仅 UI / mitmproxy 代理 |
186
+ | `[mock]` | 按冻结的 api_objects 回放 |
187
+ | `[excel]` / `[fake]` | 表格 / 假数据 |
188
+ | `[bdd]` / `[test]` | behave / pytest |
189
+ | `[all]` | 元 extra:上述能力 extra 的并集(不含 `[dev]`) |
190
+ | `[dev]` | `tuner-testkit[all]`,给本仓 editable 开发 |
191
+
192
+ CLI 与 `python -m tuner_testkit.…` 等价,例如 `tuner-recorder`、`tuner-page-recorder`、`tuner-api-recorder`、`tuner-mock-server`。依赖 extra 的命令在业务仓用 `uv run tuner-dump-ddl` / `uv run tuner-recorder`。
193
+
194
+ ---
195
+
196
+ ## 安全
197
+
198
+ 不得把 token、cookie、Authorization、密码、session 写入仓库(含 capture 与 api_objects)。凭证只允许运行时注入。
199
+
200
+ ---
201
+
202
+ ## 本仓库(平台源码)
203
+
204
+ 克隆后在仓库根目录开发 kit 本身:
205
+
206
+ ```powershell
207
+ uv venv
208
+ uv sync --extra all
209
+ ```
210
+
211
+ `uv sync --extra dev` 与 `--extra all` 等价(`dev` 只是引用 `[all]`)。
212
+
213
+ 4.1.0 发行说明见 [`docs/changelog/TEMPLATE-4.1.0.md`](docs/changelog/TEMPLATE-4.1.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
@@ -0,0 +1,168 @@
1
+ # tuner-testkit
2
+
3
+ 发行名 **`tuner-testkit`**,导入名 **`tuner_testkit`**。给被测系统(SUT)测试仓提供公共运行库与 CLI(db / API / Web UI / 录制 / mock),以及 Cursor/git **DNA**(rules、skills、hooks)。
4
+
5
+ 业务资产(page/api objects、action words、features)留在**各项目仓**的 `packages/` 与 `tests/`,不进本包。平台发新版本后,下游用 `uv` 按需升级,不必再整树拷贝运行库。
6
+
7
+ ---
8
+
9
+ ## 标准作业流程
10
+
11
+ ### 1. 工具域:只装核心 kit(能 `tuner-init` 即可)
12
+
13
+ `uv tool install` 和业务仓 `.venv` 是两套环境。下游在 **tool 域只装默认 wheel**,用来拿 `tuner-init` / `tuner-dna`;**不要**在 tool 域打开 `[db]` / `[api]` 等 extra。
14
+
15
+ ```bash
16
+ uv tool install tuner-testkit
17
+ ```
18
+
19
+ 入口命令是 `tuner-init`、`tuner-dna` 等(`tuner-*`),**没有** `tuner-testkit` 这个 script。`tuner-dump-ddl`、`tuner-recorder` 等依赖 extra 的 CLI,请在业务仓用 `uv run …` 跑,走该仓 `.venv`。
20
+
21
+ ### 2. 初始化测试仓
22
+
23
+ ```bash
24
+ tuner-init scaffold ../my-sut-tests
25
+ cd ../my-sut-tests
26
+ uv sync
27
+ ```
28
+
29
+ `scaffold` 会铺六层目录、写入依赖 `tuner-testkit[db,api]` 的 `pyproject.toml`,并执行一次 `tuner-dna sync`(把 `.cursor/`、`docs/spec/`、`tools/git-hooks/` 放进**项目树**)。可在任意目录运行,不必先有测试仓。不要用 `tuner-testkit init repo`。
30
+
31
+ `uv sync` 把 **db / api 装进业务仓 `.venv`**,不是 tool 域。已有项目仓则在该仓根目录:
32
+
33
+ ```bash
34
+ uv add "tuner-testkit[db,api]>=4.0.0"
35
+ uv sync
36
+ ```
37
+
38
+ Web UI / 合录等按需再加 extra:
39
+
40
+ ```bash
41
+ uv add "tuner-testkit[web-ui]"
42
+ uv add "tuner-testkit[recorder]"
43
+ ```
44
+
45
+ 测 kit 全能力(平台狗食仓等)一次打开全部能力 extra:
46
+
47
+ ```bash
48
+ uv add "tuner-testkit[all]"
49
+ uv sync
50
+ ```
51
+
52
+ ### 3. 开始写业务
53
+
54
+ 在**项目仓**里写,不要改 site-packages 里的 kit:
55
+
56
+ | 你写什么 | 放哪里 |
57
+ | --- | --- |
58
+ | 页面 / 接口资产 | `packages/page_objects/`、`packages/api_objects/` |
59
+ | 业务动作 | `packages/action_words/` |
60
+ | BDD / pytest | `tests/features/`、`tests/pytest/` |
61
+ | 知识(DDL、用例) | `assets/` |
62
+ | 本仓私有工具 | `apps/`(`python -m apps.<name>`) |
63
+
64
+ 代码里 `from tuner_testkit.db import …` / `from tuner_testkit.page_test import …`。密钥只放本机 `config/env_local.py` 或环境变量(`TUNER_ENV`、`TUNER_DB_<ALIAS>_*`),**不要提交**。
65
+
66
+ 录制产物同样写到项目仓 `packages/`,不会写进 venv。
67
+
68
+ ### 4. 获取 PyPI 上的更新
69
+
70
+ 平台发新版本后,下游从 [PyPI:tuner-testkit](https://pypi.org/project/tuner-testkit/) 取 wheel,**不要**再拷本仓源码。tool 域和业务仓 `.venv` 是两份安装,**两边都要升**,再铺 DNA。
71
+
72
+ **先看当前装的是哪一版、PyPI 最新是哪一版:**
73
+
74
+ ```bash
75
+ uv tool list # tool 域里的 tuner-testkit
76
+ cd ../my-sut-tests
77
+ uv pip show tuner-testkit # 业务仓 .venv
78
+ ```
79
+
80
+ 发行说明见 [`docs/changelog/FRAMEWORK.md`](docs/changelog/FRAMEWORK.md) 与该版本的 `docs/changelog/TEMPLATE-*.md`。
81
+
82
+ **① tool 域(只升核心 CLI)**
83
+
84
+ ```bash
85
+ uv tool upgrade tuner-testkit
86
+ ```
87
+
88
+ 升的是 `tuner-init` / `tuner-dna` 所在环境。这里仍然**不要**加 `[db]` / `[api]`。尚未 `uv tool install` 过则先执行第 1 节。
89
+
90
+ **② 业务仓 `.venv`(升运行库 + extras)**
91
+
92
+ 在**项目仓根目录**改依赖并同步 lock。保留你原来打开的 extra(普通仓 `[db,api]`,狗食/全能力仓 `[all]`):
93
+
94
+ ```bash
95
+ # 钉到某一发行版(推荐,和团队 lock 一致)
96
+ uv add "tuner-testkit[db,api]==4.1.0"
97
+
98
+ # 或只抬下限,让解析器选允许范围内的最新
99
+ # uv add "tuner-testkit[db,api]>=4.1.0"
100
+
101
+ uv sync
102
+ ```
103
+
104
+ 已经写过 `>=4.0.0`、只想把 lock 里的 kit 升到 PyPI 最新:
105
+
106
+ ```bash
107
+ uv lock --upgrade-package tuner-testkit
108
+ uv sync
109
+ ```
110
+
111
+ 只改 `pyproject.toml` 里的版本再 `uv lock` / `uv sync` 也可以。一个 wheel 不能「只升 web-ui、钉死旧 db」。
112
+
113
+ **③ 同步 DNA 并提交**
114
+
115
+ `uv add` / `uv sync` 只更新 site-packages 里的运行库。Cursor 读的是项目树里的 `.cursor/`、`docs/spec/`、`tools/git-hooks/`,必须再铺一层:
116
+
117
+ ```bash
118
+ tuner-dna sync
119
+ tuner-dna check
120
+ git add -A && git commit
121
+ ```
122
+
123
+ `tuner-dna check` 核对项目树 DNA 是否与**当前 PATH 上那份** kit 一致。建议先 `uv tool upgrade`,再 `sync`,避免 CLI 还是旧包、`.venv` 已是新包。
124
+
125
+ 新仓第一次仍用第 2 节的 `tuner-init scaffold`(会写依赖并做一次 `tuner-dna sync`),不是每次发版都重新 scaffold。
126
+
127
+ `[phone-ui]` 为预留空 extra,4.0 未实现。
128
+
129
+ ---
130
+
131
+ ## extras
132
+
133
+ | extra | 内容 |
134
+ | --- | --- |
135
+ | (默认 wheel) | `config` / `logging`、`tuner-init`、`tuner-dna`(tool 域只装这个) |
136
+ | `[db]` | MySQL / SQL Server / PostgreSQL(装在业务仓 `.venv`) |
137
+ | `[api]` | `api_test`(HTTP 客户端) |
138
+ | `[web-ui]` | `page_test` + Playwright |
139
+ | `[phone-ui]` | 预留,无实现 |
140
+ | `[recorder]` | 合录 / 仅 UI / mitmproxy 代理 |
141
+ | `[mock]` | 按冻结的 api_objects 回放 |
142
+ | `[excel]` / `[fake]` | 表格 / 假数据 |
143
+ | `[bdd]` / `[test]` | behave / pytest |
144
+ | `[all]` | 元 extra:上述能力 extra 的并集(不含 `[dev]`) |
145
+ | `[dev]` | `tuner-testkit[all]`,给本仓 editable 开发 |
146
+
147
+ CLI 与 `python -m tuner_testkit.…` 等价,例如 `tuner-recorder`、`tuner-page-recorder`、`tuner-api-recorder`、`tuner-mock-server`。依赖 extra 的命令在业务仓用 `uv run tuner-dump-ddl` / `uv run tuner-recorder`。
148
+
149
+ ---
150
+
151
+ ## 安全
152
+
153
+ 不得把 token、cookie、Authorization、密码、session 写入仓库(含 capture 与 api_objects)。凭证只允许运行时注入。
154
+
155
+ ---
156
+
157
+ ## 本仓库(平台源码)
158
+
159
+ 克隆后在仓库根目录开发 kit 本身:
160
+
161
+ ```powershell
162
+ uv venv
163
+ uv sync --extra all
164
+ ```
165
+
166
+ `uv sync --extra dev` 与 `--extra all` 等价(`dev` 只是引用 `[all]`)。
167
+
168
+ 4.1.0 发行说明见 [`docs/changelog/TEMPLATE-4.1.0.md`](docs/changelog/TEMPLATE-4.1.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tuner-testkit"
3
- version = "4.0.2"
3
+ version = "4.1.0"
4
4
  description = "Shared test runtime, recorders, and DNA overlay for SUT test repos"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -51,23 +51,12 @@ bdd = [
51
51
  "playwright>=1.54.0",
52
52
  "behave-html-pretty-formatter>=1.16.1",
53
53
  ]
54
+ # Union of capability extras (excludes `dev` to avoid a cycle).
55
+ all = [
56
+ "tuner-testkit[db,api,web-ui,phone-ui,excel,fake,mock,recorder,test,bdd]",
57
+ ]
54
58
  dev = [
55
- "pymysql>=1.2.0",
56
- "pymssql>=2.3.0",
57
- "psycopg[binary]>=3.2",
58
- "sqlalchemy>=2.0",
59
- "requests>=2.33.1",
60
- "pydantic>=2",
61
- "faker>=37.0.0",
62
- "openpyxl>=3.1.0",
63
- "fastapi>=0.115.0",
64
- "uvicorn[standard]>=0.32.0",
65
- "httpx>=0.28.0",
66
- "pytest>=9.0.3",
67
- "behave>=1.2.6",
68
- "playwright>=1.54.0",
69
- "behave-html-pretty-formatter>=1.16.1",
70
- "mitmproxy>=11.1.3",
59
+ "tuner-testkit[all]",
71
60
  ]
72
61
 
73
62
  [project.scripts]
@@ -2,4 +2,4 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- __version__ = "4.0.2"
5
+ __version__ = "4.1.0"
@@ -0,0 +1,213 @@
1
+ Metadata-Version: 2.4
2
+ Name: tuner-testkit
3
+ Version: 4.1.0
4
+ Summary: Shared test runtime, recorders, and DNA overlay for SUT test repos
5
+ Author: tuner-testkit contributors
6
+ License-Expression: MIT
7
+ Requires-Python: >=3.12
8
+ Description-Content-Type: text/markdown
9
+ License-File: LICENSE
10
+ Requires-Dist: pydantic>=2
11
+ Provides-Extra: db
12
+ Requires-Dist: pymysql>=1.2.0; extra == "db"
13
+ Requires-Dist: pymssql>=2.3.0; extra == "db"
14
+ Requires-Dist: psycopg[binary]>=3.2; extra == "db"
15
+ Requires-Dist: sqlalchemy>=2.0; extra == "db"
16
+ Provides-Extra: api
17
+ Requires-Dist: requests>=2.33.1; extra == "api"
18
+ Provides-Extra: web-ui
19
+ Requires-Dist: playwright>=1.54.0; extra == "web-ui"
20
+ Provides-Extra: phone-ui
21
+ Provides-Extra: excel
22
+ Requires-Dist: openpyxl>=3.1.0; extra == "excel"
23
+ Provides-Extra: fake
24
+ Requires-Dist: faker>=37.0.0; extra == "fake"
25
+ Provides-Extra: mock
26
+ Requires-Dist: fastapi>=0.115.0; extra == "mock"
27
+ Requires-Dist: uvicorn[standard]>=0.32.0; extra == "mock"
28
+ Requires-Dist: httpx>=0.28.0; extra == "mock"
29
+ Provides-Extra: recorder
30
+ Requires-Dist: playwright>=1.54.0; extra == "recorder"
31
+ Requires-Dist: mitmproxy>=11.1.3; extra == "recorder"
32
+ Provides-Extra: test
33
+ Requires-Dist: pytest>=9.0.3; extra == "test"
34
+ Requires-Dist: openpyxl>=3.1.0; extra == "test"
35
+ Requires-Dist: httpx>=0.28.0; extra == "test"
36
+ Provides-Extra: bdd
37
+ Requires-Dist: behave>=1.2.6; extra == "bdd"
38
+ Requires-Dist: playwright>=1.54.0; extra == "bdd"
39
+ Requires-Dist: behave-html-pretty-formatter>=1.16.1; extra == "bdd"
40
+ Provides-Extra: all
41
+ Requires-Dist: tuner-testkit[api,bdd,db,excel,fake,mock,phone-ui,recorder,test,web-ui]; extra == "all"
42
+ Provides-Extra: dev
43
+ Requires-Dist: tuner-testkit[all]; extra == "dev"
44
+ Dynamic: license-file
45
+
46
+ # tuner-testkit
47
+
48
+ 发行名 **`tuner-testkit`**,导入名 **`tuner_testkit`**。给被测系统(SUT)测试仓提供公共运行库与 CLI(db / API / Web UI / 录制 / mock),以及 Cursor/git **DNA**(rules、skills、hooks)。
49
+
50
+ 业务资产(page/api objects、action words、features)留在**各项目仓**的 `packages/` 与 `tests/`,不进本包。平台发新版本后,下游用 `uv` 按需升级,不必再整树拷贝运行库。
51
+
52
+ ---
53
+
54
+ ## 标准作业流程
55
+
56
+ ### 1. 工具域:只装核心 kit(能 `tuner-init` 即可)
57
+
58
+ `uv tool install` 和业务仓 `.venv` 是两套环境。下游在 **tool 域只装默认 wheel**,用来拿 `tuner-init` / `tuner-dna`;**不要**在 tool 域打开 `[db]` / `[api]` 等 extra。
59
+
60
+ ```bash
61
+ uv tool install tuner-testkit
62
+ ```
63
+
64
+ 入口命令是 `tuner-init`、`tuner-dna` 等(`tuner-*`),**没有** `tuner-testkit` 这个 script。`tuner-dump-ddl`、`tuner-recorder` 等依赖 extra 的 CLI,请在业务仓用 `uv run …` 跑,走该仓 `.venv`。
65
+
66
+ ### 2. 初始化测试仓
67
+
68
+ ```bash
69
+ tuner-init scaffold ../my-sut-tests
70
+ cd ../my-sut-tests
71
+ uv sync
72
+ ```
73
+
74
+ `scaffold` 会铺六层目录、写入依赖 `tuner-testkit[db,api]` 的 `pyproject.toml`,并执行一次 `tuner-dna sync`(把 `.cursor/`、`docs/spec/`、`tools/git-hooks/` 放进**项目树**)。可在任意目录运行,不必先有测试仓。不要用 `tuner-testkit init repo`。
75
+
76
+ `uv sync` 把 **db / api 装进业务仓 `.venv`**,不是 tool 域。已有项目仓则在该仓根目录:
77
+
78
+ ```bash
79
+ uv add "tuner-testkit[db,api]>=4.0.0"
80
+ uv sync
81
+ ```
82
+
83
+ Web UI / 合录等按需再加 extra:
84
+
85
+ ```bash
86
+ uv add "tuner-testkit[web-ui]"
87
+ uv add "tuner-testkit[recorder]"
88
+ ```
89
+
90
+ 测 kit 全能力(平台狗食仓等)一次打开全部能力 extra:
91
+
92
+ ```bash
93
+ uv add "tuner-testkit[all]"
94
+ uv sync
95
+ ```
96
+
97
+ ### 3. 开始写业务
98
+
99
+ 在**项目仓**里写,不要改 site-packages 里的 kit:
100
+
101
+ | 你写什么 | 放哪里 |
102
+ | --- | --- |
103
+ | 页面 / 接口资产 | `packages/page_objects/`、`packages/api_objects/` |
104
+ | 业务动作 | `packages/action_words/` |
105
+ | BDD / pytest | `tests/features/`、`tests/pytest/` |
106
+ | 知识(DDL、用例) | `assets/` |
107
+ | 本仓私有工具 | `apps/`(`python -m apps.<name>`) |
108
+
109
+ 代码里 `from tuner_testkit.db import …` / `from tuner_testkit.page_test import …`。密钥只放本机 `config/env_local.py` 或环境变量(`TUNER_ENV`、`TUNER_DB_<ALIAS>_*`),**不要提交**。
110
+
111
+ 录制产物同样写到项目仓 `packages/`,不会写进 venv。
112
+
113
+ ### 4. 获取 PyPI 上的更新
114
+
115
+ 平台发新版本后,下游从 [PyPI:tuner-testkit](https://pypi.org/project/tuner-testkit/) 取 wheel,**不要**再拷本仓源码。tool 域和业务仓 `.venv` 是两份安装,**两边都要升**,再铺 DNA。
116
+
117
+ **先看当前装的是哪一版、PyPI 最新是哪一版:**
118
+
119
+ ```bash
120
+ uv tool list # tool 域里的 tuner-testkit
121
+ cd ../my-sut-tests
122
+ uv pip show tuner-testkit # 业务仓 .venv
123
+ ```
124
+
125
+ 发行说明见 [`docs/changelog/FRAMEWORK.md`](docs/changelog/FRAMEWORK.md) 与该版本的 `docs/changelog/TEMPLATE-*.md`。
126
+
127
+ **① tool 域(只升核心 CLI)**
128
+
129
+ ```bash
130
+ uv tool upgrade tuner-testkit
131
+ ```
132
+
133
+ 升的是 `tuner-init` / `tuner-dna` 所在环境。这里仍然**不要**加 `[db]` / `[api]`。尚未 `uv tool install` 过则先执行第 1 节。
134
+
135
+ **② 业务仓 `.venv`(升运行库 + extras)**
136
+
137
+ 在**项目仓根目录**改依赖并同步 lock。保留你原来打开的 extra(普通仓 `[db,api]`,狗食/全能力仓 `[all]`):
138
+
139
+ ```bash
140
+ # 钉到某一发行版(推荐,和团队 lock 一致)
141
+ uv add "tuner-testkit[db,api]==4.1.0"
142
+
143
+ # 或只抬下限,让解析器选允许范围内的最新
144
+ # uv add "tuner-testkit[db,api]>=4.1.0"
145
+
146
+ uv sync
147
+ ```
148
+
149
+ 已经写过 `>=4.0.0`、只想把 lock 里的 kit 升到 PyPI 最新:
150
+
151
+ ```bash
152
+ uv lock --upgrade-package tuner-testkit
153
+ uv sync
154
+ ```
155
+
156
+ 只改 `pyproject.toml` 里的版本再 `uv lock` / `uv sync` 也可以。一个 wheel 不能「只升 web-ui、钉死旧 db」。
157
+
158
+ **③ 同步 DNA 并提交**
159
+
160
+ `uv add` / `uv sync` 只更新 site-packages 里的运行库。Cursor 读的是项目树里的 `.cursor/`、`docs/spec/`、`tools/git-hooks/`,必须再铺一层:
161
+
162
+ ```bash
163
+ tuner-dna sync
164
+ tuner-dna check
165
+ git add -A && git commit
166
+ ```
167
+
168
+ `tuner-dna check` 核对项目树 DNA 是否与**当前 PATH 上那份** kit 一致。建议先 `uv tool upgrade`,再 `sync`,避免 CLI 还是旧包、`.venv` 已是新包。
169
+
170
+ 新仓第一次仍用第 2 节的 `tuner-init scaffold`(会写依赖并做一次 `tuner-dna sync`),不是每次发版都重新 scaffold。
171
+
172
+ `[phone-ui]` 为预留空 extra,4.0 未实现。
173
+
174
+ ---
175
+
176
+ ## extras
177
+
178
+ | extra | 内容 |
179
+ | --- | --- |
180
+ | (默认 wheel) | `config` / `logging`、`tuner-init`、`tuner-dna`(tool 域只装这个) |
181
+ | `[db]` | MySQL / SQL Server / PostgreSQL(装在业务仓 `.venv`) |
182
+ | `[api]` | `api_test`(HTTP 客户端) |
183
+ | `[web-ui]` | `page_test` + Playwright |
184
+ | `[phone-ui]` | 预留,无实现 |
185
+ | `[recorder]` | 合录 / 仅 UI / mitmproxy 代理 |
186
+ | `[mock]` | 按冻结的 api_objects 回放 |
187
+ | `[excel]` / `[fake]` | 表格 / 假数据 |
188
+ | `[bdd]` / `[test]` | behave / pytest |
189
+ | `[all]` | 元 extra:上述能力 extra 的并集(不含 `[dev]`) |
190
+ | `[dev]` | `tuner-testkit[all]`,给本仓 editable 开发 |
191
+
192
+ CLI 与 `python -m tuner_testkit.…` 等价,例如 `tuner-recorder`、`tuner-page-recorder`、`tuner-api-recorder`、`tuner-mock-server`。依赖 extra 的命令在业务仓用 `uv run tuner-dump-ddl` / `uv run tuner-recorder`。
193
+
194
+ ---
195
+
196
+ ## 安全
197
+
198
+ 不得把 token、cookie、Authorization、密码、session 写入仓库(含 capture 与 api_objects)。凭证只允许运行时注入。
199
+
200
+ ---
201
+
202
+ ## 本仓库(平台源码)
203
+
204
+ 克隆后在仓库根目录开发 kit 本身:
205
+
206
+ ```powershell
207
+ uv venv
208
+ uv sync --extra all
209
+ ```
210
+
211
+ `uv sync --extra dev` 与 `--extra all` 等价(`dev` 只是引用 `[all]`)。
212
+
213
+ 4.1.0 发行说明见 [`docs/changelog/TEMPLATE-4.1.0.md`](docs/changelog/TEMPLATE-4.1.0.md);3.x → 4.x 迁移见 [`TEMPLATE-4.0.0.md`](docs/changelog/TEMPLATE-4.0.0.md)。平台能力地图见 [`INDEX.md`](INDEX.md)。
@@ -1,5 +1,8 @@
1
1
  pydantic>=2
2
2
 
3
+ [all]
4
+ tuner-testkit[api,bdd,db,excel,fake,mock,phone-ui,recorder,test,web-ui]
5
+
3
6
  [api]
4
7
  requests>=2.33.1
5
8
 
@@ -15,22 +18,7 @@ psycopg[binary]>=3.2
15
18
  sqlalchemy>=2.0
16
19
 
17
20
  [dev]
18
- pymysql>=1.2.0
19
- pymssql>=2.3.0
20
- psycopg[binary]>=3.2
21
- sqlalchemy>=2.0
22
- requests>=2.33.1
23
- pydantic>=2
24
- faker>=37.0.0
25
- openpyxl>=3.1.0
26
- fastapi>=0.115.0
27
- uvicorn[standard]>=0.32.0
28
- httpx>=0.28.0
29
- pytest>=9.0.3
30
- behave>=1.2.6
31
- playwright>=1.54.0
32
- behave-html-pretty-formatter>=1.16.1
33
- mitmproxy>=11.1.3
21
+ tuner-testkit[all]
34
22
 
35
23
  [excel]
36
24
  openpyxl>=3.1.0