quadkit-testing 0.0.42__tar.gz → 0.0.44__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 (275) hide show
  1. quadkit_testing-0.0.44/.gitignore +24 -0
  2. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/PKG-INFO +6 -22
  3. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/README.md +3 -3
  4. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/pyproject.toml +3 -26
  5. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/__init__.py +1 -1
  6. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/flags.py +1 -1
  7. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/__init__.py +1 -1
  8. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/generators_contract.py +33 -0
  9. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/probes.py +15 -11
  10. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/admin_helpers.py +2 -2
  11. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_subpackage_exports.py +31 -0
  12. quadkit_testing-0.0.42/.gitignore +0 -214
  13. quadkit_testing-0.0.42/docs/ARCHITECTURE.md +0 -571
  14. quadkit_testing-0.0.42/docs/COMPLIANCE.md +0 -123
  15. quadkit_testing-0.0.42/docs/CONFIGURATION.md +0 -52
  16. quadkit_testing-0.0.42/docs/GUIDE.md +0 -191
  17. quadkit_testing-0.0.42/docs/HOWTOS.md +0 -220
  18. quadkit_testing-0.0.42/docs/QUICKSTART.md +0 -66
  19. quadkit_testing-0.0.42/docs/TROUBLESHOOTING.md +0 -174
  20. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/__init__.py +0 -64
  21. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/bed.py +0 -115
  22. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/client.py +0 -22
  23. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/__init__.py +0 -134
  24. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/_async.py +0 -30
  25. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/beds.py +0 -36
  26. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/mocks.py +0 -82
  27. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/tokens.py +0 -196
  28. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/fixtures/users.py +0 -239
  29. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/test_client.py +0 -157
  30. quadkit_testing-0.0.42/src/quadkit/testing/clients/auth/types.py +0 -141
  31. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/__init__.py +0 -101
  32. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/bed.py +0 -114
  33. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/client.py +0 -16
  34. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/client_core.py +0 -275
  35. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/data.py +0 -60
  36. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/__init__.py +0 -143
  37. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/_async.py +0 -30
  38. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/beds.py +0 -57
  39. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/data.py +0 -173
  40. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/lifecycle.py +0 -219
  41. quadkit_testing-0.0.42/src/quadkit/testing/clients/cache/fixtures/scenarios.py +0 -65
  42. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/__init__.py +0 -111
  43. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/client.py +0 -26
  44. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/__init__.py +0 -17
  45. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/command_client.py +0 -159
  46. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/event_client.py +0 -227
  47. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/query_client.py +0 -159
  48. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/test_bed.py +0 -116
  49. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components/test_data.py +0 -195
  50. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/__init__.py +0 -262
  51. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/_async.py +0 -34
  52. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/beds.py +0 -121
  53. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/data.py +0 -219
  54. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/handlers.py +0 -169
  55. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/models.py +0 -139
  56. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/fixtures/scenarios.py +0 -52
  57. quadkit_testing-0.0.42/src/quadkit/testing/clients/events/py.typed +0 -0
  58. quadkit_testing-0.0.42/src/quadkit/testing/clients/search/__init__.py +0 -40
  59. quadkit_testing-0.0.42/src/quadkit/testing/clients/search/client.py +0 -431
  60. quadkit_testing-0.0.42/src/quadkit/testing/clients/search/fixtures.py +0 -63
  61. quadkit_testing-0.0.42/src/quadkit/testing/clients/search/py.typed +0 -0
  62. quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/__init__.py +0 -11
  63. quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/fixtures.py +0 -81
  64. quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/mocks.py +0 -41
  65. quadkit_testing-0.0.42/src/quadkit/testing/clients/storage/py.typed +0 -0
  66. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/__init__.py +0 -23
  67. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/bed.py +0 -122
  68. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/client.py +0 -149
  69. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/data.py +0 -88
  70. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/mocks.py +0 -306
  71. quadkit_testing-0.0.42/src/quadkit/testing/clients/tasks/py.typed +0 -0
  72. quadkit_testing-0.0.42/src/quadkit/testing/clients/ui/__init__.py +0 -7
  73. quadkit_testing-0.0.42/src/quadkit/testing/clients/ui/core.py +0 -106
  74. quadkit_testing-0.0.42/src/quadkit/testing/clients/web/py.typed +0 -0
  75. quadkit_testing-0.0.42/src/quadkit/testing/fakes/secrets.py +0 -14
  76. quadkit_testing-0.0.42/src/quadkit/testing/fixtures/ai.py +0 -190
  77. quadkit_testing-0.0.42/src/quadkit/testing/fixtures/py.typed +0 -0
  78. quadkit_testing-0.0.42/src/quadkit/testing/fixtures/tasks.py +0 -57
  79. quadkit_testing-0.0.42/src/quadkit/testing/harness/environment.py +0 -249
  80. quadkit_testing-0.0.42/src/quadkit/testing/py.typed +0 -0
  81. quadkit_testing-0.0.42/tests/integration/test_ai_client.py +0 -290
  82. quadkit_testing-0.0.42/tests/integration/test_bed.py +0 -380
  83. quadkit_testing-0.0.42/tests/unit/test_cache_client_fixtures.py +0 -234
  84. quadkit_testing-0.0.42/tests/unit/test_cache_clients.py +0 -313
  85. quadkit_testing-0.0.42/tests/unit/test_command_query_test_clients.py +0 -215
  86. quadkit_testing-0.0.42/tests/unit/test_compliance_suites.py +0 -354
  87. quadkit_testing-0.0.42/tests/unit/test_event_test_client.py +0 -210
  88. quadkit_testing-0.0.42/tests/unit/test_fakes_observability.py +0 -136
  89. quadkit_testing-0.0.42/tests/unit/test_fixture_modules.py +0 -418
  90. quadkit_testing-0.0.42/tests/unit/test_harness_container.py +0 -172
  91. quadkit_testing-0.0.42/tests/unit/test_integration_environment.py +0 -319
  92. quadkit_testing-0.0.42/tests/unit/test_round33_hardening.py +0 -79
  93. quadkit_testing-0.0.42/tests/unit/test_tasks_clients.py +0 -290
  94. quadkit_testing-0.0.42/tests/unit/test_testing_stack_scenario.py +0 -332
  95. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/LICENSE +0 -0
  96. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/NOTICE +0 -0
  97. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/py.typed +0 -0
  98. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/README.md +0 -0
  99. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/__init__.py +0 -0
  100. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/_lazy_exports.py +0 -0
  101. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/__init__.py +0 -0
  102. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/bed.py +0 -0
  103. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/client.py +0 -0
  104. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/ai/data.py +0 -0
  105. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/__init__.py +0 -0
  106. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/bed.py +0 -0
  107. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/db/client.py +0 -0
  108. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/__init__.py +0 -0
  109. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/bed.py +0 -0
  110. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clients/web/client.py +0 -0
  111. {quadkit_testing-0.0.42/src/quadkit/testing/clients/auth → quadkit_testing-0.0.44/src/quadkit/testing/clients/web}/py.typed +0 -0
  112. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/clock.py +0 -0
  113. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/audit.py +0 -0
  114. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/blob_store.py +0 -0
  115. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/cache.py +0 -0
  116. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/database.py +0 -0
  117. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/distributed_lock.py +0 -0
  118. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/event_bus.py +0 -0
  119. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/middleware.py +0 -0
  120. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/notification.py +0 -0
  121. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/queue_backend.py +0 -0
  122. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/repository.py +0 -0
  123. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/search.py +0 -0
  124. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/secrets.py +0 -0
  125. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/task_queue.py +0 -0
  126. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/vector_store.py +0 -0
  127. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/compliance/webhook.py +0 -0
  128. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/config.py +0 -0
  129. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/constants.py +0 -0
  130. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/decorators.py +0 -0
  131. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/di/__init__.py +0 -0
  132. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/events.py +0 -0
  133. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/exceptions.py +0 -0
  134. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/audit.py +0 -0
  135. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/buses.py +0 -0
  136. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/cache.py +0 -0
  137. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/clock.py +0 -0
  138. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/config.py +0 -0
  139. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/events.py +0 -0
  140. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/governance.py +0 -0
  141. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/lifecycle.py +0 -0
  142. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/logging.py +0 -0
  143. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/monitoring.py +0 -0
  144. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/redis.py +0 -0
  145. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fakes/tracing.py +0 -0
  146. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/__init__.py +0 -0
  147. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/bed.py +0 -0
  148. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/container.py +0 -0
  149. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/containers.py +0 -0
  150. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/core.py +0 -0
  151. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/db.py +0 -0
  152. {quadkit_testing-0.0.42/src/quadkit/testing/clients/cache → quadkit_testing-0.0.44/src/quadkit/testing/fixtures}/py.typed +0 -0
  153. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/fixtures/web.py +0 -0
  154. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/generators.py +0 -0
  155. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/__init__.py +0 -0
  156. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/container.py +0 -0
  157. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/decorators.py +0 -0
  158. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/overrides.py +0 -0
  159. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/harness/testbed.py +0 -0
  160. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/hooks.py +0 -0
  161. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/__init__.py +0 -0
  162. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/cleanup.py +0 -0
  163. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/config.py +0 -0
  164. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/fixtures.py +0 -0
  165. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/integration/markers.py +0 -0
  166. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/__init__.py +0 -0
  167. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/assertions.py +0 -0
  168. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/async_helper.py +0 -0
  169. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/factory.py +0 -0
  170. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/smoke.py +0 -0
  171. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/snapshots.py +0 -0
  172. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/lib/stubs.py +0 -0
  173. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/__init__.py +0 -0
  174. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/audit.py +0 -0
  175. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/blob_store.py +0 -0
  176. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/cache.py +0 -0
  177. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/config/__init__.py +0 -0
  178. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/config/models.py +0 -0
  179. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/constants.py +0 -0
  180. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/cqrs.py +0 -0
  181. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/di/__init__.py +0 -0
  182. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/di/provider.py +0 -0
  183. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/event_bus.py +0 -0
  184. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/exceptions.py +0 -0
  185. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/lock.py +0 -0
  186. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/notification.py +0 -0
  187. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/outbox.py +0 -0
  188. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/queue.py +0 -0
  189. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/repository.py +0 -0
  190. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/search.py +0 -0
  191. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/memory/uow.py +0 -0
  192. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/__init__.py +0 -0
  193. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/base.py +0 -0
  194. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/mocks/test_provider.py +0 -0
  195. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/module.py +0 -0
  196. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/__init__.py +0 -0
  197. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/pytest/__init__.py +0 -0
  198. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/plugins/pytest/plugin.py +0 -0
  199. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/protocols.py +0 -0
  200. {quadkit_testing-0.0.42/src/quadkit/testing/clients/events/components → quadkit_testing-0.0.44/src/quadkit/testing}/py.typed +0 -0
  201. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/__init__.py +0 -0
  202. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/assertions.py +0 -0
  203. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/environment.py +0 -0
  204. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/fakes.py +0 -0
  205. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/testkit/fixtures.py +0 -0
  206. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/types.py +0 -0
  207. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/websocket/__init__.py +0 -0
  208. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/websocket/client.py +0 -0
  209. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/workflow/__init__.py +0 -0
  210. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/src/quadkit/testing/workflow/harness.py +0 -0
  211. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/__snapshots__/test_snapshot_function.json +0 -0
  212. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/conftest.py +0 -0
  213. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/integration/test_web_client.py +0 -0
  214. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/test_package_structure_p1.py +0 -0
  215. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/__snapshots__/test_snapshot_function.json +0 -0
  216. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/_integration_helpers.py +0 -0
  217. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/conftest.py +0 -0
  218. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_ai_client_budget.py +0 -0
  219. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_ai_clients.py +0 -0
  220. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_app_testbed.py +0 -0
  221. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_app_testbed_from_factory_overrides.py +0 -0
  222. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_assertion_helpers.py +0 -0
  223. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_async_helper.py +0 -0
  224. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container.py +0 -0
  225. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_bind.py +0 -0
  226. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_factory_auto_registration.py +0 -0
  227. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_container_try_resolve.py +0 -0
  228. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_db_clients.py +0 -0
  229. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_db_transaction_fixture.py +0 -0
  230. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_environment_lifecycle.py +0 -0
  231. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_exceptions.py +0 -0
  232. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_factory.py +0 -0
  233. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_audit.py +0 -0
  234. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_event_bus_ordering.py +0 -0
  235. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fake_tracer.py +0 -0
  236. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes.py +0 -0
  237. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes_cluster.py +0 -0
  238. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_fakes_lifecycle.py +0 -0
  239. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_generators_util.py +0 -0
  240. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_harness_testkit.py +0 -0
  241. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_cleanup.py +0 -0
  242. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_cluster.py +0 -0
  243. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_fixtures.py +0 -0
  244. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_integration_probes.py +0 -0
  245. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_admin_client.py +0 -0
  246. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_async_helpers.py +0 -0
  247. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_lib_helpers.py +0 -0
  248. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_backends.py +0 -0
  249. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_cqrs.py +0 -0
  250. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_event_bus.py +0 -0
  251. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_lock.py +0 -0
  252. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_outbox.py +0 -0
  253. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_memory_repository.py +0 -0
  254. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_mocks.py +0 -0
  255. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_mocks_cluster.py +0 -0
  256. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_override_context_manager_revert.py +0 -0
  257. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_plugin.py +0 -0
  258. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_public_exports.py +0 -0
  259. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_pytest_plugin_fixtures.py +0 -0
  260. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_service_probe_connectivity.py +0 -0
  261. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_small_modules.py +0 -0
  262. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_smoke.py +0 -0
  263. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_snapshot_asserter_create_compare.py +0 -0
  264. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_snapshots.py +0 -0
  265. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_stubs.py +0 -0
  266. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment.py +0 -0
  267. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment_facade.py +0 -0
  268. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_test_environment_overrides.py +0 -0
  269. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_constants.py +0 -0
  270. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_module.py +0 -0
  271. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testing_utils.py +0 -0
  272. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_testkit_surface.py +0 -0
  273. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_utilities.py +0 -0
  274. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_web_clients.py +0 -0
  275. {quadkit_testing-0.0.42 → quadkit_testing-0.0.44}/tests/unit/test_workflow_websocket_plugins.py +0 -0
@@ -0,0 +1,24 @@
1
+ # Generated public-repository ignore rules.
2
+ # Private monorepo paths are intentionally not referenced here.
3
+
4
+ __pycache__/
5
+ *.py[cod]
6
+ *.so
7
+ *.egg-info/
8
+ .venv/
9
+ venv/
10
+ .env
11
+ .env.*
12
+ !.env.example
13
+ .pytest_cache/
14
+ .ruff_cache/
15
+ .mypy_cache/
16
+ .coverage
17
+ coverage.xml
18
+ htmlcov/
19
+ build/
20
+ dist/
21
+ *.log
22
+ .DS_Store
23
+ .idea/
24
+ .vscode/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit-testing
3
- Version: 0.0.42
3
+ Version: 0.0.44
4
4
  Summary: Centralized testing infrastructure for Quadkit Framework - Fixtures, factories, and utilities
5
5
  Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
@@ -32,23 +32,9 @@ Requires-Dist: pytest-mock<4,>=3.10.0
32
32
  Requires-Dist: pytest<10,>=8.0.0
33
33
  Requires-Dist: quadkit-contracts>=0.0.2
34
34
  Requires-Dist: quadkit>=0.0.2
35
- Provides-Extra: all
36
- Requires-Dist: aiosqlite<1,>=0.19.0; extra == 'all'
37
- Requires-Dist: asyncpg<1,>=0.29.0; extra == 'all'
38
- Requires-Dist: httpx2<3,>=2.0.0; extra == 'all'
39
- Requires-Dist: httpx<1,>=0.26.0; extra == 'all'
40
- Requires-Dist: quadkit-auth>=0.0.2; extra == 'all'
41
- Requires-Dist: quadkit-cache>=0.0.2; extra == 'all'
42
- Requires-Dist: quadkit-storage>=0.0.2; extra == 'all'
43
- Requires-Dist: starlette<2,>=0.28.0; extra == 'all'
44
- Provides-Extra: auth
45
- Requires-Dist: quadkit-auth>=0.0.2; extra == 'auth'
46
- Provides-Extra: cache
47
- Requires-Dist: quadkit-cache>=0.0.2; extra == 'cache'
48
35
  Provides-Extra: db
49
- Requires-Dist: aiosqlite<1,>=0.19.0; extra == 'db'
50
- Requires-Dist: asyncpg<1,>=0.29.0; extra == 'db'
51
- Requires-Dist: quadkit-sql>=0.0.2; extra == 'db'
36
+ Requires-Dist: aiosqlite>=0.19.0; extra == 'db'
37
+ Requires-Dist: asyncpg>=0.29.0; extra == 'db'
52
38
  Provides-Extra: dev
53
39
  Requires-Dist: black<27,>=23.0.0; extra == 'dev'
54
40
  Requires-Dist: mypy<3,>=1.0.0; extra == 'dev'
@@ -62,8 +48,6 @@ Requires-Dist: motor<4,>=3.3.0; extra == 'integration'
62
48
  Requires-Dist: neo4j<7,>=5.18.0; extra == 'integration'
63
49
  Requires-Dist: qdrant-client<2,>=1.9.0; extra == 'integration'
64
50
  Requires-Dist: redis<9,>=5.0.0; extra == 'integration'
65
- Provides-Extra: storage
66
- Requires-Dist: quadkit-storage>=0.0.2; extra == 'storage'
67
51
  Provides-Extra: web
68
52
  Requires-Dist: httpx2<3,>=2.0.0; extra == 'web'
69
53
  Requires-Dist: httpx<1,>=0.26.0; extra == 'web'
@@ -250,10 +234,10 @@ vulnerabilities privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/
250
234
 
251
235
  ## Stability
252
236
 
253
- Version `0.0.42` in the `0.x` series, released in lockstep with the
237
+ Version `0.0.44` in the `0.x` series, released in lockstep with the
254
238
  other four distributions; APIs may change between minor versions until
255
- 1.0 — pin an exact version (`quadkit-testing==0.0.42`) or a tight range
256
- (`>=0.0.42,<0.1.0`). Full policy:
239
+ 1.0 — pin an exact version (`quadkit-testing==0.0.44`) or a tight range
240
+ (`>=0.0.44,<0.1.0`). Full policy:
257
241
  [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
258
242
 
259
243
  ## Links
@@ -178,10 +178,10 @@ vulnerabilities privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/
178
178
 
179
179
  ## Stability
180
180
 
181
- Version `0.0.42` in the `0.x` series, released in lockstep with the
181
+ Version `0.0.44` in the `0.x` series, released in lockstep with the
182
182
  other four distributions; APIs may change between minor versions until
183
- 1.0 — pin an exact version (`quadkit-testing==0.0.42`) or a tight range
184
- (`>=0.0.42,<0.1.0`). Full policy:
183
+ 1.0 — pin an exact version (`quadkit-testing==0.0.44`) or a tight range
184
+ (`>=0.0.44,<0.1.0`). Full policy:
185
185
  [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
186
186
 
187
187
  ## Links
@@ -6,7 +6,7 @@ build-backend = "hatchling.build"
6
6
 
7
7
  [project]
8
8
  name = "quadkit-testing"
9
- version = "0.0.42"
9
+ version = "0.0.44"
10
10
  description = "Centralized testing infrastructure for Quadkit Framework - Fixtures, factories, and utilities"
11
11
  readme = "README.md"
12
12
  requires-python = ">=3.11"
@@ -53,39 +53,19 @@ text = "Apache-2.0"
53
53
 
54
54
  [project.optional-dependencies]
55
55
  db = [
56
- "aiosqlite>=0.19.0,<1",
57
- "asyncpg>=0.29.0,<1",
58
- "quadkit-sql>=0.0.2",
56
+ "aiosqlite>=0.19.0",
57
+ "asyncpg>=0.29.0",
59
58
  ]
60
59
  web = [
61
60
  "httpx>=0.26.0,<1",
62
61
  "httpx2>=2.0.0,<3",
63
62
  "starlette>=0.28.0,<2",
64
63
  ]
65
- auth = [
66
- "quadkit-auth>=0.0.2",
67
- ]
68
- cache = [
69
- "quadkit-cache>=0.0.2",
70
- ]
71
- storage = [
72
- "quadkit-storage>=0.0.2",
73
- ]
74
64
  dev = [
75
65
  "black>=23.0.0,<27",
76
66
  "ruff>=0.16.4,<1",
77
67
  "mypy>=1.0.0,<3",
78
68
  ]
79
- all = [
80
- "aiosqlite>=0.19.0,<1",
81
- "asyncpg>=0.29.0,<1",
82
- "httpx>=0.26.0,<1",
83
- "httpx2>=2.0.0,<3",
84
- "starlette>=0.28.0,<2",
85
- "quadkit-auth>=0.0.2",
86
- "quadkit-cache>=0.0.2",
87
- "quadkit-storage>=0.0.2",
88
- ]
89
69
  integration = [
90
70
  "asyncpg>=0.29.0,<1",
91
71
  "aiosqlite>=0.19.0,<1",
@@ -184,9 +164,6 @@ workspace = true
184
164
  [tool.uv.sources.quadkit-contracts]
185
165
  workspace = true
186
166
 
187
- [tool.uv.sources.quadkit-secrets]
188
- workspace = true
189
-
190
167
  [tool.uv.sources.quadkit-sql]
191
168
  workspace = true
192
169
 
@@ -8,7 +8,7 @@ method, and pytest runs the contract checks::
8
8
  return RedisCacheBackend("redis://localhost:6379/15")
9
9
 
10
10
  Every suite named in `__all__` is importable; the secret-store suite ships only
11
- with the optional `quadkit-secrets` extra, so accessing it without that extra
11
+ with the optional `the optional provider` extra, so accessing it without that extra
12
12
  raises `AttributeError` instead of failing at import time.
13
13
  """
14
14
 
@@ -23,7 +23,7 @@ import pytest
23
23
  def _flag_not_found_error() -> type[Exception]:
24
24
  """Return the optional provider exception without a static private import."""
25
25
  try:
26
- module = import_module("quadkit.features.exceptions")
26
+ module = import_module("the optional provider module")
27
27
  # The attribute ships only with a feature-provider install.
28
28
  return cast("type[Exception]", getattr(module, "FlagNotFoundError")) # noqa: B009
29
29
  except (ImportError, AttributeError):
@@ -25,7 +25,7 @@ _LAZY_IMPORTS: Final[dict[str, tuple[str, str]]] = {
25
25
  ),
26
26
  }
27
27
 
28
- # Re-exports the production memory backend owned by ``quadkit-secrets``, which
28
+ # Re-exports the production memory backend owned by ``the optional provider``, which
29
29
  # is not part of the published set.
30
30
  _OPTIONAL_MODULES: Final[frozenset[str]] = frozenset({"quadkit.testing.fakes.secrets"})
31
31
 
@@ -8,6 +8,30 @@ from pathlib import Path
8
8
  from typing import Any
9
9
 
10
10
 
11
+ def _assert_marker_convention(py_path: Path, text: str) -> None:
12
+ """Enforce the generated-stub marker convention on one rendered ``.py``.
13
+
14
+ Generated stubs pair ``# @INTENT: <goal>`` directly above ``# @TODO:
15
+ <action>`` and never ship a bare ``# TODO:`` (the ``@`` prefix keeps both
16
+ greppable). See ``docs/09-27-2026/GENERATED_CODE_MARKERS.md``.
17
+ """
18
+ lines = text.splitlines()
19
+ for i, line in enumerate(lines):
20
+ stripped = line.strip()
21
+ if stripped.startswith("# TODO"):
22
+ raise AssertionError(
23
+ f"{py_path}: bare '# TODO' in generated code must be '# @TODO' "
24
+ f"-> {line!r}"
25
+ )
26
+ if stripped.startswith("# @TODO:"):
27
+ prev = lines[i - 1].strip() if i > 0 else ""
28
+ if not prev.startswith("# @INTENT:"):
29
+ raise AssertionError(
30
+ f"{py_path}: '# @TODO' at line {i + 1} is not preceded by "
31
+ f"a '# @INTENT:' line (found {prev!r})"
32
+ )
33
+
34
+
11
35
  def assert_contributor_generators_render(
12
36
  contributor: Any,
13
37
  *,
@@ -77,6 +101,15 @@ def assert_contributor_generators_render(
77
101
  f"(created={len(created)}, overwritten={len(overwritten)}, "
78
102
  f"staged={len(staged)})"
79
103
  )
104
+
105
+ # Every rendered Python stub must follow the @INTENT/@TODO marker
106
+ # convention — a single gate so a new generator (or a template at a
107
+ # deeper package nesting) cannot reintroduce a bare ``# TODO``.
108
+ for py_file in out.rglob("*.py"):
109
+ if "__pycache__" in py_file.parts:
110
+ continue
111
+ _assert_marker_convention(py_file, py_file.read_text(encoding="utf-8"))
112
+
80
113
  exercised += 1
81
114
  return exercised
82
115
 
@@ -51,7 +51,7 @@ class ServiceProbe:
51
51
  await client.close()
52
52
  return True
53
53
  except Exception as e: # noqa: BLE001
54
- logger.debug("probe_failed", service="redis", url=url, error=str(e))
54
+ logger.debug("probe_failed", dependency="redis", url=url, error=str(e))
55
55
  return False
56
56
 
57
57
  @staticmethod
@@ -66,7 +66,7 @@ class ServiceProbe:
66
66
  await conn.close()
67
67
  return True
68
68
  except Exception as e: # noqa: BLE001
69
- logger.debug("probe_failed", service="postgres", dsn=dsn, error=str(e))
69
+ logger.debug("probe_failed", dependency="postgres", dsn=dsn, error=str(e))
70
70
  return False
71
71
 
72
72
  @staticmethod
@@ -79,7 +79,9 @@ class ServiceProbe:
79
79
  response = await client.get(url)
80
80
  return response.status_code == 200
81
81
  except Exception as e: # noqa: BLE001
82
- logger.debug("probe_failed", service="elasticsearch", url=url, error=str(e))
82
+ logger.debug(
83
+ "probe_failed", dependency="elasticsearch", url=url, error=str(e)
84
+ )
83
85
  return False
84
86
 
85
87
  @staticmethod
@@ -94,7 +96,7 @@ class ServiceProbe:
94
96
  await connection.close()
95
97
  return True
96
98
  except Exception as e: # noqa: BLE001
97
- logger.debug("probe_failed", service="rabbitmq", url=url, error=str(e))
99
+ logger.debug("probe_failed", dependency="rabbitmq", url=url, error=str(e))
98
100
  return False
99
101
 
100
102
  @staticmethod
@@ -107,7 +109,9 @@ class ServiceProbe:
107
109
  response = await client.get(f"{url}/health")
108
110
  return response.status_code == 200
109
111
  except Exception as e: # noqa: BLE001
110
- logger.debug("probe_failed", service="meilisearch", url=url, error=str(e))
112
+ logger.debug(
113
+ "probe_failed", dependency="meilisearch", url=url, error=str(e)
114
+ )
111
115
  return False
112
116
 
113
117
  @staticmethod
@@ -125,7 +129,7 @@ class ServiceProbe:
125
129
  return True
126
130
  except Exception as e: # noqa: BLE001
127
131
  logger.debug(
128
- "probe_failed", service="smtp", host=host, port=port, error=str(e)
132
+ "probe_failed", dependency="smtp", host=host, port=port, error=str(e)
129
133
  )
130
134
  return False
131
135
 
@@ -152,7 +156,7 @@ class ServiceProbe:
152
156
  return True
153
157
  except Exception as e: # noqa: BLE001
154
158
  logger.debug(
155
- "probe_failed", service="kafka", bootstrap=bootstrap, error=str(e)
159
+ "probe_failed", dependency="kafka", bootstrap=bootstrap, error=str(e)
156
160
  )
157
161
  return False
158
162
 
@@ -179,7 +183,7 @@ class ServiceProbe:
179
183
  return True
180
184
  except Exception as e: # noqa: BLE001
181
185
  logger.debug(
182
- "probe_failed", service="minio", endpoint=endpoint, error=str(e)
186
+ "probe_failed", dependency="minio", endpoint=endpoint, error=str(e)
183
187
  )
184
188
  return False
185
189
 
@@ -207,7 +211,7 @@ class ServiceProbe:
207
211
  await writer.wait_closed()
208
212
  return True
209
213
  except Exception as e: # noqa: BLE001
210
- logger.debug("probe_failed", service="mongodb", dsn=dsn, error=str(e))
214
+ logger.debug("probe_failed", dependency="mongodb", dsn=dsn, error=str(e))
211
215
  return False
212
216
 
213
217
  @staticmethod
@@ -234,7 +238,7 @@ class ServiceProbe:
234
238
  await writer.wait_closed()
235
239
  return True
236
240
  except Exception as e: # noqa: BLE001
237
- logger.debug("probe_failed", service="qdrant", url=url, error=str(e))
241
+ logger.debug("probe_failed", dependency="qdrant", url=url, error=str(e))
238
242
  return False
239
243
 
240
244
  @staticmethod
@@ -261,5 +265,5 @@ class ServiceProbe:
261
265
  await writer.wait_closed()
262
266
  return True
263
267
  except Exception as e: # noqa: BLE001
264
- logger.debug("probe_failed", service="neo4j", url=url, error=str(e))
268
+ logger.debug("probe_failed", dependency="neo4j", url=url, error=str(e))
265
269
  return False
@@ -1,4 +1,4 @@
1
- """Admin-specific test helpers for quadkit-admin tests."""
1
+ """Admin-specific test helpers for the optional provider tests."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -42,7 +42,7 @@ class AdminResponse:
42
42
 
43
43
 
44
44
  class AdminTestClient:
45
- """Test client with helpers for quadkit-admin endpoints.
45
+ """Test client with helpers for the optional provider endpoints.
46
46
 
47
47
  Wraps a Starlette ``TestClient`` (or any httpx-compatible sync client)
48
48
  and provides assertion helpers and convenience methods for CRUD operations.
@@ -18,6 +18,8 @@ from typing import Any
18
18
 
19
19
  import pytest
20
20
 
21
+ from quadkit.testing._lazy_exports import module_shipped
22
+
21
23
 
22
24
  def get_public_members(module: Any) -> set[str]:
23
25
  """Get all public member names from a module (not starting with _)."""
@@ -45,6 +47,29 @@ def get_public_defined_members(module: Any) -> set[str]:
45
47
  return defined
46
48
 
47
49
 
50
+ def optional_module_absent(subpackage: Any, export_name: str) -> bool:
51
+ """Whether an export belongs to an optional module this installation omits.
52
+
53
+ A facade keeps the names of an absent optional module in ``__all__`` so the
54
+ declared surface stays truthful, and ``resolve_export`` answers an access
55
+ with ``AttributeError``. That is the designed outcome for a name whose
56
+ module is not part of the installation, so it is not an export failure.
57
+
58
+ Args:
59
+ subpackage: Facade module holding ``_LAZY_IMPORTS`` and ``__all__``.
60
+ export_name: One name from that facade's ``__all__``.
61
+
62
+ Returns:
63
+ Whether the name's module is an optional one that is not shipped here.
64
+ """
65
+ table = getattr(subpackage, "_LAZY_IMPORTS", None)
66
+ entry = table.get(export_name) if table is not None else None
67
+ if entry is None:
68
+ return False
69
+ optional = getattr(subpackage, "_OPTIONAL_MODULES", frozenset())
70
+ return entry[0] in optional and not module_shipped(entry[0])
71
+
72
+
48
73
  class TestComplianceSubpackageExports:
49
74
  """Test that compliance subpackage exports all public APIs."""
50
75
 
@@ -185,6 +210,8 @@ class TestFixturesSubpackageExports:
185
210
  from quadkit.testing import fixtures
186
211
 
187
212
  for export_name in fixtures.__all__:
213
+ if optional_module_absent(fixtures, export_name):
214
+ continue
188
215
  assert hasattr(fixtures, export_name), (
189
216
  f"fixtures.{export_name} not accessible but listed in __all__"
190
217
  )
@@ -196,6 +223,8 @@ class TestFixturesSubpackageExports:
196
223
  from quadkit.testing import fixtures
197
224
 
198
225
  for export_name in fixtures.__all__:
226
+ if optional_module_absent(fixtures, export_name):
227
+ continue
199
228
  obj = getattr(fixtures, export_name)
200
229
  # Fixtures are callables, some might be test utilities
201
230
  assert callable(obj) or inspect.isclass(obj), (
@@ -250,6 +279,8 @@ class TestAllSubpackagesConsistency:
250
279
 
251
280
  for subpackage in [compliance, fixtures, memory]:
252
281
  for export_name in subpackage.__all__:
282
+ if optional_module_absent(subpackage, export_name):
283
+ continue
253
284
  try:
254
285
  obj = getattr(subpackage, export_name)
255
286
  assert obj is not None, (
@@ -1,214 +0,0 @@
1
- *
2
- !tests/
3
- !tests/**
4
- !README.md
5
- !AGENTS.md
6
- !DEVELOPMENT.md
7
- !QUICKGUIDE.md
8
- !MILESTONE*.md
9
- !TESTS*.md
10
- !CHANGELOG.md
11
- !AUDIT*.md
12
- !REF*.md
13
- !AUDIT*.json
14
- !LICENSE
15
- !LICENSE-MIT.txt
16
- !NOTICE
17
- !TRADEMARK.md
18
- !conftest.py
19
- !CONTRIBUTING.md
20
- !CODE_OF_CONDUCT.md
21
- !SECURITY.md
22
- !GOVERNANCE.md
23
- !pyproject.toml
24
- !uv.lock
25
- !docker-compose.yml
26
- !.env.example
27
- !.env.full.example
28
- !.importlinter
29
- !.superpowers/
30
- !.superpowers/**
31
- !.gitattributes
32
- !.editorconfig
33
- !Makefile
34
- !docker-compose.test.yml
35
- !quadkit.yaml.example
36
- !.github/
37
- !.github/workflows/
38
- !.github/workflows/**
39
- !.github/dependabot.yml
40
- !.devcontainer/
41
- !.devcontainer/**
42
- !tools/
43
- !tools/**
44
- !*example.yaml
45
-
46
- # Quadkit Packages
47
- !quadkit*/
48
- !quadkit*/pyproject.toml
49
- !quadkit*/CHANGELOG.md
50
- !quadkit*/README.md
51
- !quadkit*/alembic.ini
52
- !quadkit*/mypy.ini
53
- !quadkit*/*.yaml.example
54
- !quadkit*/src/
55
- !quadkit*/src/**
56
- !quadkit*/docs/
57
- !quadkit*/docs/**
58
- !quadkit*/tests/
59
- !quadkit*/tests/**
60
-
61
- # Keep quadkit docs
62
- !/docs/
63
- !docs/**
64
-
65
- # Session / cutover plans at the repo root
66
- !plans/
67
- !plans/**
68
-
69
- # Keep example files for README examples
70
- !/examples/
71
- !/examples/**
72
-
73
- # Re-ignore these AFTER negations (last match wins)
74
- *.tape
75
- examples/*/runs/
76
- __pycache__/
77
- *.pyc
78
- *.pyo
79
- *.egg-info/
80
- dist/
81
- build/
82
- .eggs/
83
- *.egg
84
- .pytest_cache/
85
- .mypy_cache/
86
- .ruff_cache/
87
- htmlcov/
88
- .coverage
89
- coverage.xml
90
- test.db
91
- !quadkit*/tests/fixtures/test.db
92
- *.log
93
- *.tmp
94
-
95
- # Company-specific files (keep private, do not commit)
96
- .company/
97
- COMPANY_*.md
98
- company-config/
99
- internal-docs/
100
- # Editor swap files
101
- *.swp
102
-
103
- !core/
104
- !packages/
105
- !core/quadkit*/
106
- !packages/quadkit*/
107
- !core/quadkit*/pyproject.toml
108
- !packages/quadkit*/pyproject.toml
109
- !core/quadkit*/CHANGELOG.md
110
- !packages/quadkit*/CHANGELOG.md
111
- !core/quadkit*/README.md
112
- !packages/quadkit*/README.md
113
- !core/quadkit*/alembic.ini
114
- !packages/quadkit*/alembic.ini
115
- !core/quadkit*/mypy.ini
116
- !packages/quadkit*/mypy.ini
117
- !core/quadkit*/*.yaml.example
118
- !packages/quadkit*/*.yaml.example
119
- !core/quadkit*/src/
120
- !core/quadkit*/src/**
121
- !packages/quadkit*/src/
122
- !packages/quadkit*/src/**
123
- !core/quadkit*/tests/
124
- !core/quadkit*/tests/**
125
- !packages/quadkit*/tests/
126
- !packages/quadkit*/tests/**
127
- !core/quadkit*/docs/
128
- !core/quadkit*/docs/**
129
- !packages/quadkit*/docs/
130
- !packages/quadkit*/docs/**
131
-
132
- # dev/
133
- !dev/
134
- !dev/**
135
-
136
- # Admin dev playground (committed dev asset; local SQLite files stay ignored)
137
- !packages/quadkit-admin/playground/
138
- !packages/quadkit-admin/playground/serve.py
139
-
140
- # gatewai apps
141
- !apps/
142
- !apps/**
143
- !apps/gatewai/
144
- !apps/gatewai/**
145
- apps/**/node_modules/
146
- apps/**/dist/
147
- apps/**/__pycache__/
148
- apps/**/*.pyc
149
- apps/**/*.db
150
- apps/**/*.db-wal
151
- apps/**/*.db-shm
152
- apps/**/.env
153
- apps/**/.env.*
154
- !apps/**/.env.example
155
- !apps/**/.env.full.example
156
-
157
- # Piccolina — nested app tracked in this monorepo (standalone .git removed).
158
- # Keep marketing packages and deployment secrets out of the tree.
159
- apps/piccolina/piccolina-marketing/
160
- apps/piccolina/piccolina-marketing-plans/
161
- apps/piccolina/secrets/
162
- apps/piccolina/**/secrets/
163
- apps/piccolina/**/*.pem
164
- apps/piccolina/**/*.key
165
- apps/piccolina/**/.venv/
166
- apps/piccolina/**/node_modules/
167
- apps/piccolina/**/__pycache__/
168
- apps/piccolina/**/*.pyc
169
- apps/piccolina/**/*.pbf
170
- apps/piccolina/**/.open-next/
171
- apps/piccolina/**/storage/
172
- apps/piccolina/**/.deploy-host
173
-
174
- # Re-exclude private content under the tiered paths.
175
- # MUST come after the !...docs/** negations above — last match wins.
176
- core/quadkit*/docs/plans/
177
- packages/quadkit*/docs/plans/
178
- core/quadkit*/docs/**/
179
- packages/quadkit*/docs/**/
180
-
181
- # Re-exclude tooling artifacts under the tiered paths
182
- __pycache__/
183
- *.pyc
184
- *.pyo
185
- *.egg-info/
186
- .pytest_cache/
187
- .mypy_cache/
188
- .ruff_cache/
189
- htmlcov/
190
- .coverage
191
- coverage.xml
192
- test.db
193
- *.tmp
194
- *.log
195
- !core/quadkit*/tests/fixtures/test.db
196
- !packages/quadkit*/tests/fixtures/test.db
197
-
198
- # Allow the generated example gifs to be tracked (README hero images).
199
- !core/quadkit*/docs/gifs/
200
- !core/quadkit*/docs/gifs/**
201
- !packages/*/quadkit*/docs/gifs/
202
- !packages/*/quadkit*/docs/gifs/**
203
- examples/*/screenshot.png
204
- !banner*
205
- apps/quadkit-playground/**/node_modules/
206
- apps/quadkit-playground/**/dist/
207
- apps/quadkit-playground/**/__pycache__/
208
- apps/quadkit-playground/**/*.pyc
209
- apps/quadkit-playground/**/*.db
210
- apps/quadkit-playground/**/*.db-wal
211
- apps/quadkit-playground/**/*.db-shm
212
- apps/quadkit-playground/projects/
213
- apps/quadkit-playground/quadkit/
214
- docs/superpowers/