quadkit 0.0.4__tar.gz → 0.0.42__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 (681) hide show
  1. {quadkit-0.0.4 → quadkit-0.0.42}/.gitignore +32 -1
  2. {quadkit-0.0.4 → quadkit-0.0.42}/PKG-INFO +4 -3
  3. {quadkit-0.0.4 → quadkit-0.0.42}/README.md +2 -2
  4. {quadkit-0.0.4 → quadkit-0.0.42}/pyproject.toml +2 -1
  5. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/models.py +6 -0
  6. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/codegen/__init__.py +3 -0
  7. quadkit-0.0.42/src/quadkit/codegen/field_types.py +131 -0
  8. quadkit-0.0.42/src/quadkit/observability/di/sub_providers/observability.py +68 -0
  9. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_observability.py +45 -0
  10. quadkit-0.0.4/src/quadkit/observability/di/sub_providers/observability.py +0 -52
  11. {quadkit-0.0.4 → quadkit-0.0.42}/CHANGELOG.md +0 -0
  12. {quadkit-0.0.4 → quadkit-0.0.42}/LICENSE +0 -0
  13. {quadkit-0.0.4 → quadkit-0.0.42}/NOTICE +0 -0
  14. {quadkit-0.0.4 → quadkit-0.0.42}/docs/ARCHITECTURE.md +0 -0
  15. {quadkit-0.0.4 → quadkit-0.0.42}/docs/CONFIGURATION.md +0 -0
  16. {quadkit-0.0.4 → quadkit-0.0.42}/docs/GUIDE.md +0 -0
  17. {quadkit-0.0.4 → quadkit-0.0.42}/docs/HOWTOS.md +0 -0
  18. {quadkit-0.0.4 → quadkit-0.0.42}/docs/QUICKSTART.md +0 -0
  19. {quadkit-0.0.4 → quadkit-0.0.42}/docs/SECURITY.md +0 -0
  20. {quadkit-0.0.4 → quadkit-0.0.42}/docs/TROUBLESHOOTING.md +0 -0
  21. {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/app.py +0 -0
  22. {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/hero.tape +0 -0
  23. {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/quadkit-hero.gif +0 -0
  24. {quadkit-0.0.4 → quadkit-0.0.42}/docs/plugins.md +0 -0
  25. {quadkit-0.0.4 → quadkit-0.0.42}/example.yaml +0 -0
  26. {quadkit-0.0.4 → quadkit-0.0.42}/src/import_error.txt +0 -0
  27. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/__init__.py +0 -0
  28. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/__init__.py +0 -0
  29. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/asgi_lifespan.py +0 -0
  30. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/base.py +0 -0
  31. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/__init__.py +0 -0
  32. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/discovery.py +0 -0
  33. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config_validation.py +0 -0
  34. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/constants.py +0 -0
  35. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/di/__init__.py +0 -0
  36. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/di/provider.py +0 -0
  37. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/discovery.py +0 -0
  38. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/events.py +0 -0
  39. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/exceptions.py +0 -0
  40. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/factory.py +0 -0
  41. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/health_probes.py +0 -0
  42. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/injectable_provider.py +0 -0
  43. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/invoker.py +0 -0
  44. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/lifecycle.py +0 -0
  45. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/module.py +0 -0
  46. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/pipeline.py +0 -0
  47. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/protocols.py +0 -0
  48. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/py.typed +0 -0
  49. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/runner.py +0 -0
  50. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/secrets.py +0 -0
  51. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/standard.py +0 -0
  52. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/types.py +0 -0
  53. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/codegen/base.py +0 -0
  54. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/__init__.py +0 -0
  55. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/__init__.py +0 -0
  56. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/py.typed +0 -0
  57. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
  58. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/__init__.py +0 -0
  59. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/channel.py +0 -0
  60. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/py.typed +0 -0
  61. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/config.py +0 -0
  62. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/constants.py +0 -0
  63. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/__init__.py +0 -0
  64. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/provider.py +0 -0
  65. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/py.typed +0 -0
  66. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/exceptions.py +0 -0
  67. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/__init__.py +0 -0
  68. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
  69. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/parallel.py +0 -0
  70. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/py.typed +0 -0
  71. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/task_manager.py +0 -0
  72. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/__init__.py +0 -0
  73. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/py.typed +0 -0
  74. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/rwlock.py +0 -0
  75. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/module.py +0 -0
  76. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/py.typed +0 -0
  77. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/task_utils.py +0 -0
  78. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/__init__.py +0 -0
  79. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/base.py +0 -0
  80. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/constants.py +0 -0
  81. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/di/__init__.py +0 -0
  82. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/di/provider.py +0 -0
  83. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/exceptions.py +0 -0
  84. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/__init__.py +0 -0
  85. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/merge.py +0 -0
  86. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/registry.py +0 -0
  87. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/sources.py +0 -0
  88. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/validation.py +0 -0
  89. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/watcher.py +0 -0
  90. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/main.py +0 -0
  91. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/protocols.py +0 -0
  92. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/secrets.py +0 -0
  93. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/types.py +0 -0
  94. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/constants.py +0 -0
  95. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/__init__.py +0 -0
  96. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/_graph.py +0 -0
  97. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/builder.py +0 -0
  98. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/config/__init__.py +0 -0
  99. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/config/models.py +0 -0
  100. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/constants.py +0 -0
  101. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/__init__.py +0 -0
  102. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container.py +0 -0
  103. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_introspection.py +0 -0
  104. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_resolution.py +0 -0
  105. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_runtime.py +0 -0
  106. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/registrar.py +0 -0
  107. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/resolver.py +0 -0
  108. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/scope.py +0 -0
  109. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/validation.py +0 -0
  110. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/context.py +0 -0
  111. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/decorators.py +0 -0
  112. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/exceptions.py +0 -0
  113. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/__init__.py +0 -0
  114. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
  115. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/discovery.py +0 -0
  116. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/interceptors.py +0 -0
  117. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/strategies.py +0 -0
  118. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/validator.py +0 -0
  119. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/function_provider.py +0 -0
  120. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/integration/__init__.py +0 -0
  121. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/integration/provider.py +0 -0
  122. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/markers.py +0 -0
  123. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/__init__.py +0 -0
  124. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/base.py +0 -0
  125. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/__init__.py +0 -0
  126. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
  127. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/compiler.py +0 -0
  128. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/context.py +0 -0
  129. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
  130. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/collect.py +0 -0
  131. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
  132. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
  133. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/order.py +0 -0
  134. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
  135. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
  136. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
  137. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/constants.py +0 -0
  138. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/decorator.py +0 -0
  139. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/dynamic.py +0 -0
  140. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/errors.py +0 -0
  141. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/graph.py +0 -0
  142. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/introspection.py +0 -0
  143. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/metadata.py +0 -0
  144. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/registry.py +0 -0
  145. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/__init__.py +0 -0
  146. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/events.py +0 -0
  147. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/health.py +0 -0
  148. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/lifecycle.py +0 -0
  149. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
  150. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/registry.py +0 -0
  151. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/protocols.py +0 -0
  152. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/provider.py +0 -0
  153. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/provider_utils.py +0 -0
  154. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/py.typed +0 -0
  155. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/__init__.py +0 -0
  156. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/context.py +0 -0
  157. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/descriptor.py +0 -0
  158. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/diagnostics.py +0 -0
  159. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/injector.py +0 -0
  160. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/invoker.py +0 -0
  161. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/registry.py +0 -0
  162. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/resolver.py +0 -0
  163. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/store.py +0 -0
  164. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/type_hints.py +0 -0
  165. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/validator.py +0 -0
  166. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/types.py +0 -0
  167. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/__init__.py +0 -0
  168. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/constants.py +0 -0
  169. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/exceptions.py +0 -0
  170. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/__init__.py +0 -0
  171. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/aggregate.py +0 -0
  172. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/base.py +0 -0
  173. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/coercion.py +0 -0
  174. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/entity.py +0 -0
  175. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/factory.py +0 -0
  176. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/py.typed +0 -0
  177. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/value_object.py +0 -0
  178. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/module.py +0 -0
  179. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/py.typed +0 -0
  180. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/types.py +0 -0
  181. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/unit_of_work.py +0 -0
  182. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/exceptions.py +0 -0
  183. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/__init__.py +0 -0
  184. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/ambient.py +0 -0
  185. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/registry.py +0 -0
  186. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/types.py +0 -0
  187. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/__init__.py +0 -0
  188. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/ambient.py +0 -0
  189. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/config.py +0 -0
  190. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/constants.py +0 -0
  191. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/di/__init__.py +0 -0
  192. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/di/provider.py +0 -0
  193. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/generator.py +0 -0
  194. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/README.md +0 -0
  195. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/__init__.py +0 -0
  196. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/__init__.py +0 -0
  197. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/models.py +0 -0
  198. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/redaction.py +0 -0
  199. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/sampling.py +0 -0
  200. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/configurator.py +0 -0
  201. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/constants.py +0 -0
  202. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/debug.py +0 -0
  203. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/di/__init__.py +0 -0
  204. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/di/provider.py +0 -0
  205. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/factory.py +0 -0
  206. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/processors.py +0 -0
  207. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/redaction.py +0 -0
  208. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/types.py +0 -0
  209. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/__init__.py +0 -0
  210. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/config.py +0 -0
  211. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/constants.py +0 -0
  212. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/core/__init__.py +0 -0
  213. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/core/mapper.py +0 -0
  214. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/di/__init__.py +0 -0
  215. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/di/provider.py +0 -0
  216. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/exceptions.py +0 -0
  217. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/module.py +0 -0
  218. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/protocols.py +0 -0
  219. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/py.typed +0 -0
  220. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/types.py +0 -0
  221. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/__init__.py +0 -0
  222. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/__init__.py +0 -0
  223. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/caching.py +0 -0
  224. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/di.py +0 -0
  225. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/observability.py +0 -0
  226. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/resilience.py +0 -0
  227. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/routing.py +0 -0
  228. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/validation.py +0 -0
  229. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/config.py +0 -0
  230. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/constants.py +0 -0
  231. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/__init__.py +0 -0
  232. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/chain.py +0 -0
  233. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/exception_filters.py +0 -0
  234. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/registry.py +0 -0
  235. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/di/__init__.py +0 -0
  236. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/di/provider.py +0 -0
  237. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/exceptions.py +0 -0
  238. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/module.py +0 -0
  239. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/types.py +0 -0
  240. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/module.py +0 -0
  241. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/__init__.py +0 -0
  242. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/core.py +0 -0
  243. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/di/__init__.py +0 -0
  244. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
  245. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/__init__.py +0 -0
  246. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/discovery.py +0 -0
  247. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/engine.py +0 -0
  248. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/exceptions.py +0 -0
  249. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/module.py +0 -0
  250. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/state.py +0 -0
  251. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/__init__.py +0 -0
  252. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/builder.py +0 -0
  253. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/clock.py +0 -0
  254. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/constants.py +0 -0
  255. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context.py +0 -0
  256. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context_keys.py +0 -0
  257. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context_registry.py +0 -0
  258. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/data.py +0 -0
  259. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/di/__init__.py +0 -0
  260. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/di/provider.py +0 -0
  261. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/exceptions.py +0 -0
  262. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/lazy.py +0 -0
  263. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/pipeline.py +0 -0
  264. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/protocols.py +0 -0
  265. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/__init__.py +0 -0
  266. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/core.py +0 -0
  267. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/introspection.py +0 -0
  268. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/trusted_html.py +0 -0
  269. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/types.py +0 -0
  270. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/typing.py +0 -0
  271. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/py.typed +0 -0
  272. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/__init__.py +0 -0
  273. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/core.py +0 -0
  274. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/exceptions.py +0 -0
  275. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/__init__.py +0 -0
  276. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/control.py +0 -0
  277. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/time_ops.py +0 -0
  278. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/transform.py +0 -0
  279. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/retry.py +0 -0
  280. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/subjects.py +0 -0
  281. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/__init__.py +0 -0
  282. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/_pipeline.py +0 -0
  283. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/errors.py +0 -0
  284. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/types.py +0 -0
  285. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/utils.py +0 -0
  286. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/__init__.py +0 -0
  287. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/base.py +0 -0
  288. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/canonical_json.py +0 -0
  289. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/content_addressed.py +0 -0
  290. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/__init__.py +0 -0
  291. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/config.py +0 -0
  292. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/constants.py +0 -0
  293. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/decorators.py +0 -0
  294. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/encryption/__init__.py +0 -0
  295. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/encryption/service.py +0 -0
  296. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/events.py +0 -0
  297. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/exceptions.py +0 -0
  298. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/__init__.py +0 -0
  299. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/chain.py +0 -0
  300. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/decorator.py +0 -0
  301. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/__init__.py +0 -0
  302. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/ambient.py +0 -0
  303. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/digest.py +0 -0
  304. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/kdf.py +0 -0
  305. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hooks.py +0 -0
  306. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/provider.py +0 -0
  307. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/py.typed +0 -0
  308. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/__init__.py +0 -0
  309. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/filename.py +0 -0
  310. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/html.py +0 -0
  311. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/sanitizer.py +0 -0
  312. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/url.py +0 -0
  313. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/__init__.py +0 -0
  314. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/rotation.py +0 -0
  315. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/store.py +0 -0
  316. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/types.py +0 -0
  317. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/types.py +0 -0
  318. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/__init__.py +0 -0
  319. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/__init__.py +0 -0
  320. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/json.py +0 -0
  321. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/py.typed +0 -0
  322. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/config.py +0 -0
  323. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/constants.py +0 -0
  324. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/__init__.py +0 -0
  325. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/provider.py +0 -0
  326. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/py.typed +0 -0
  327. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/__init__.py +0 -0
  328. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/domain.py +0 -0
  329. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/py.typed +0 -0
  330. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/exceptions.py +0 -0
  331. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/module.py +0 -0
  332. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/py.typed +0 -0
  333. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/__init__.py +0 -0
  334. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/py.typed +0 -0
  335. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/registry.py +0 -0
  336. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/__init__.py +0 -0
  337. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/py.typed +0 -0
  338. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/schema.py +0 -0
  339. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/types.py +0 -0
  340. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/types.py +0 -0
  341. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/__init__.py +0 -0
  342. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/config.py +0 -0
  343. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/constants.py +0 -0
  344. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/decorators.py +0 -0
  345. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/__init__.py +0 -0
  346. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/coercion.py +0 -0
  347. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/py.typed +0 -0
  348. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/validator.py +0 -0
  349. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/exceptions.py +0 -0
  350. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/module.py +0 -0
  351. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/py.typed +0 -0
  352. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/__init__.py +0 -0
  353. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/py.typed +0 -0
  354. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/rules.py +0 -0
  355. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/__init__.py +0 -0
  356. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/fields.py +0 -0
  357. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/introspection.py +0 -0
  358. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/py.typed +0 -0
  359. {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/types.py +0 -0
  360. {quadkit-0.0.4 → quadkit-0.0.42}/tests/conftest.py +0 -0
  361. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/__init__.py +0 -0
  362. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/__init__.py +0 -0
  363. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/_fixtures.py +0 -0
  364. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/conftest.py +0 -0
  365. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_boot_level.py +0 -0
  366. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_cross_method.py +0 -0
  367. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_dependency_chain.py +0 -0
  368. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_exports.py +0 -0
  369. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_importers.py +0 -0
  370. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_module_health_integration.py +0 -0
  371. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
  372. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_name_lookup.py +0 -0
  373. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
  374. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
  375. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
  376. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
  377. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_corrected_patterns_integration.py +0 -0
  378. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_database_integration.py +0 -0
  379. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_full_pipeline.py +0 -0
  380. {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_monitor_config_integration.py +0 -0
  381. {quadkit-0.0.4 → quadkit-0.0.42}/tests/test.md +0 -0
  382. {quadkit-0.0.4 → quadkit-0.0.42}/tests/test_import_diagnostic.py +0 -0
  383. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/__init__.py +0 -0
  384. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/aop/test_interceptor_timeout.py +0 -0
  385. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/clock/test_clock.py +0 -0
  386. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/__init__.py +0 -0
  387. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_generator_base.py +0 -0
  388. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_staged_generation.py +0 -0
  389. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_template_overrides.py +0 -0
  390. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/conftest.py +0 -0
  391. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_bounded_channel.py +0 -0
  392. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_channel.py +0 -0
  393. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_config.py +0 -0
  394. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
  395. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
  396. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
  397. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
  398. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
  399. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
  400. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_config_pool.py +0 -0
  401. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_dispatcher.py +0 -0
  402. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_sync_bridge.py +0 -0
  403. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_task_manager.py +0 -0
  404. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_task_utils.py +0 -0
  405. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_constants_new.py +0 -0
  406. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_protocols.py +0 -0
  407. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_sources.py +0 -0
  408. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_env_interpolation.py +0 -0
  409. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_loader_fail_fast.py +0 -0
  410. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_logging_redaction_config.py +0 -0
  411. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_logging_sampling.py +0 -0
  412. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_profile_overlay.py +0 -0
  413. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_scoping.py +0 -0
  414. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_secrets_validator.py +0 -0
  415. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_strict_bool_env.py +0 -0
  416. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_strict_sections.py +0 -0
  417. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_context_correlation.py +0 -0
  418. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_core_constants.py +0 -0
  419. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_core_types.py +0 -0
  420. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_request_context_di.py +0 -0
  421. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_typing.py +0 -0
  422. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/validation/test_protocols.py +0 -0
  423. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/__init__.py +0 -0
  424. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/integration/test_provider.py +0 -0
  425. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/__init__.py +0 -0
  426. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/conftest.py +0 -0
  427. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_compiler.py +0 -0
  428. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_decorator.py +0 -0
  429. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_dynamic.py +0 -0
  430. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_errors.py +0 -0
  431. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_global.py +0 -0
  432. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_graph_reflection.py +0 -0
  433. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_health_graph.py +0 -0
  434. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_integration.py +0 -0
  435. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_introspection.py +0 -0
  436. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_lifecycle.py +0 -0
  437. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_module_lifecycle.py +0 -0
  438. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_reexport.py +0 -0
  439. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_registry.py +0 -0
  440. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_stub_compiler.py +0 -0
  441. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_stub_decorator.py +0 -0
  442. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_visibility.py +0 -0
  443. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_advanced_features.py +0 -0
  444. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_basics.py +0 -0
  445. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_builder.py +0 -0
  446. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_freeze.py +0 -0
  447. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_hardening.py +0 -0
  448. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_visibility.py +0 -0
  449. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_decorators.py +0 -0
  450. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_descriptor.py +0 -0
  451. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_constants_new.py +0 -0
  452. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_decorators.py +0 -0
  453. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
  454. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_diagnostics.py +0 -0
  455. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_extensions_discovery.py +0 -0
  456. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_extensions_validator.py +0 -0
  457. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_function_provider_boot.py +0 -0
  458. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_graph_validator.py +0 -0
  459. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_interceptor_registry.py +0 -0
  460. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_invoker_unit.py +0 -0
  461. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
  462. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_validation.py +0 -0
  463. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_visibility_boot.py +0 -0
  464. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
  465. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_named_binding.py +0 -0
  466. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_orchestrator_health.py +0 -0
  467. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_basics.py +0 -0
  468. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_config_injection.py +0 -0
  469. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_conformance.py +0 -0
  470. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_orchestration.py +0 -0
  471. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_reset_state.py +0 -0
  472. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_utils.py +0 -0
  473. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_scope_concurrency.py +0 -0
  474. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_scope_manager.py +0 -0
  475. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_service_store.py +0 -0
  476. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_type_hints.py +0 -0
  477. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_validation.py +0 -0
  478. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/conftest.py +0 -0
  479. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_aggregates.py +0 -0
  480. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain.py +0 -0
  481. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_constants.py +0 -0
  482. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_exceptions.py +0 -0
  483. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_init.py +0 -0
  484. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_model_strict.py +0 -0
  485. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_module.py +0 -0
  486. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_models_factory.py +0 -0
  487. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_value_object.py +0 -0
  488. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/identity/test_identity.py +0 -0
  489. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/logging/test_logging_constants_new.py +0 -0
  490. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/conftest.py +0 -0
  491. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_auto_map.py +0 -0
  492. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_exceptions.py +0 -0
  493. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
  494. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
  495. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_mapper.py +0 -0
  496. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_module.py +0 -0
  497. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_types.py +0 -0
  498. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_protocol.py +0 -0
  499. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_registry.py +0 -0
  500. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/conftest.py +0 -0
  501. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_builtins.py +0 -0
  502. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_chain.py +0 -0
  503. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_config_alignment.py +0 -0
  504. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_exception_filters.py +0 -0
  505. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_chain.py +0 -0
  506. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_constants.py +0 -0
  507. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
  508. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
  509. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
  510. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_module.py +0 -0
  511. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_routing.py +0 -0
  512. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_types.py +0 -0
  513. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
  514. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_registry_defaults.py +0 -0
  515. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
  516. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_discovery.py +0 -0
  517. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_engine.py +0 -0
  518. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_state.py +0 -0
  519. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_state_hardening.py +0 -0
  520. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_validation.py +0 -0
  521. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_primitives_constants.py +0 -0
  522. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_registry_advanced.py +0 -0
  523. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_registry_introspection.py +0 -0
  524. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_trusted_html.py +0 -0
  525. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_control.py +0 -0
  526. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_core.py +0 -0
  527. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_facade.py +0 -0
  528. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_retry.py +0 -0
  529. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_subjects.py +0 -0
  530. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_time_ops.py +0 -0
  531. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_transform.py +0 -0
  532. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/__init__.py +0 -0
  533. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_exceptions.py +0 -0
  534. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_guards.py +0 -0
  535. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_hashing.py +0 -0
  536. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_package_hooks_p2.py +0 -0
  537. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secret_rotation_policy.py +0 -0
  538. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secrets_rotation.py +0 -0
  539. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secrets_store.py +0 -0
  540. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_api.py +0 -0
  541. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_components_p2.py +0 -0
  542. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_constants.py +0 -0
  543. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_exceptions.py +0 -0
  544. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_types.py +0 -0
  545. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/conftest.py +0 -0
  546. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_schema.py +0 -0
  547. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_constants.py +0 -0
  548. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
  549. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_domain.py +0 -0
  550. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_init.py +0 -0
  551. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_json.py +0 -0
  552. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_registry.py +0 -0
  553. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_types.py +0 -0
  554. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_boot_validation.py +0 -0
  555. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_config_and_misc.py +0 -0
  556. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_constants.py +0 -0
  557. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_discovery.py +0 -0
  558. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_health_baseline.py +0 -0
  559. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_health_config.py +0 -0
  560. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_runner_and_lifespan.py +0 -0
  561. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_types.py +0 -0
  562. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_validation_and_misc.py +0 -0
  563. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application.py +0 -0
  564. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application_base.py +0 -0
  565. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application_lifecycle.py +0 -0
  566. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_base_and_misc_exceptions.py +0 -0
  567. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
  568. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_codegen.py +0 -0
  569. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_compiler_graph_utils.py +0 -0
  570. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_component_exceptions.py +0 -0
  571. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_concurrency_constants.py +0 -0
  572. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_concurrency_exceptions.py +0 -0
  573. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config.py +0 -0
  574. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_constants.py +0 -0
  575. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_hardening.py +0 -0
  576. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_quadkit.py +0 -0
  577. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_requirements.py +0 -0
  578. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_sources.py +0 -0
  579. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_types.py +0 -0
  580. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_watcher.py +0 -0
  581. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_exceptions.py +0 -0
  582. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_introspection.py +0 -0
  583. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_override.py +0 -0
  584. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_resolver_impl.py +0 -0
  585. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_runtime_mixin.py +0 -0
  586. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_context_registry.py +0 -0
  587. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_contract_completeness.py +0 -0
  588. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_builder.py +0 -0
  589. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_constants.py +0 -0
  590. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_lazy.py +0 -0
  591. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_module.py +0 -0
  592. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_pipeline.py +0 -0
  593. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_dependency_injector.py +0 -0
  594. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_constants.py +0 -0
  595. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_descriptor.py +0 -0
  596. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_module_constants.py +0 -0
  597. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_constants.py +0 -0
  598. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_exceptions.py +0 -0
  599. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_model_base.py +0 -0
  600. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_dynamic_module.py +0 -0
  601. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_events_security_exceptions.py +0 -0
  602. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_execution_result.py +0 -0
  603. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hatch_build_targets.py +0 -0
  604. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_health_probes.py +0 -0
  605. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry.py +0 -0
  606. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_edge_cases.py +0 -0
  607. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_introspection.py +0 -0
  608. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_scenarios.py +0 -0
  609. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_identity_generators_and_ambient.py +0 -0
  610. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_infra_exceptions.py +0 -0
  611. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_input_sanitizers.py +0 -0
  612. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_interceptors.py +0 -0
  613. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_json_serialization_backend.py +0 -0
  614. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_apply_redaction.py +0 -0
  615. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_bridging.py +0 -0
  616. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_constants.py +0 -0
  617. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_debug.py +0 -0
  618. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_di_provider.py +0 -0
  619. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_factory.py +0 -0
  620. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_init.py +0 -0
  621. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_redaction.py +0 -0
  622. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_redaction_compound.py +0 -0
  623. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_types.py +0 -0
  624. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_m13_m14_verification.py +0 -0
  625. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapper.py +0 -0
  626. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapper_enhanced.py +0 -0
  627. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapping.py +0 -0
  628. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_enhancements.py +0 -0
  629. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_exceptions.py +0 -0
  630. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_new.py +0 -0
  631. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_decorator.py +0 -0
  632. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_scan_and_provide.py +0 -0
  633. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_system.py +0 -0
  634. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_no_db_imports.py +0 -0
  635. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_orchestrator_parallel.py +0 -0
  636. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_p2_scope_log_level.py +0 -0
  637. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_context.py +0 -0
  638. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_data.py +0 -0
  639. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_registry.py +0 -0
  640. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_provider_boot_enhanced.py +0 -0
  641. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_provider_decorator.py +0 -0
  642. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_quadkit_constants.py +0 -0
  643. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_quadkit_exceptions.py +0 -0
  644. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_repr_helpers.py +0 -0
  645. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_resilience_exceptions.py +0 -0
  646. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_combinators.py +0 -0
  647. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_core.py +0 -0
  648. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_pipeline.py +0 -0
  649. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_pipeline_and_utils.py +0 -0
  650. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_types_new.py +0 -0
  651. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_utils.py +0 -0
  652. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_round22_hardening.py +0 -0
  653. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_round41_hardening.py +0 -0
  654. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_saga_primitives.py +0 -0
  655. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_sampling_and_config.py +0 -0
  656. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_secret_stores_and_rotation.py +0 -0
  657. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_serialization_constants.py +0 -0
  658. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_serialization_exceptions.py +0 -0
  659. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_service_descriptor.py +0 -0
  660. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_structured_logging.py +0 -0
  661. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_time_ops.py +0 -0
  662. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_types.py +0 -0
  663. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_coercion.py +0 -0
  664. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_exceptions.py +0 -0
  665. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_rules.py +0 -0
  666. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_validator_engine.py +0 -0
  667. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/__init__.py +0 -0
  668. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/conftest.py +0 -0
  669. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_async_validator.py +0 -0
  670. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_coercion.py +0 -0
  671. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_helpers.py +0 -0
  672. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation.py +0 -0
  673. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_constants.py +0 -0
  674. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_constants_new.py +0 -0
  675. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_fields.py +0 -0
  676. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_fields_extended.py +0 -0
  677. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_init.py +0 -0
  678. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_introspection.py +0 -0
  679. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_module.py +0 -0
  680. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_types.py +0 -0
  681. {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validator.py +0 -0
@@ -149,6 +149,27 @@ apps/**/*.pyc
149
149
  apps/**/*.db
150
150
  apps/**/*.db-wal
151
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
152
173
 
153
174
  # Re-exclude private content under the tiered paths.
154
175
  # MUST come after the !...docs/** negations above — last match wins.
@@ -180,4 +201,14 @@ test.db
180
201
  !packages/*/quadkit*/docs/gifs/
181
202
  !packages/*/quadkit*/docs/gifs/**
182
203
  examples/*/screenshot.png
183
- !banner*
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/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit
3
- Version: 0.0.4
3
+ Version: 0.0.42
4
4
  Summary: Async-first DI/IoC framework for Python — core package
5
5
  Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
@@ -27,6 +27,7 @@ Classifier: Typing :: Typed
27
27
  Requires-Python: >=3.11
28
28
  Requires-Dist: orjson<4,>=3.0.0
29
29
  Requires-Dist: pydantic<3,>=2.10.0
30
+ Requires-Dist: pyyaml<7,>=6.0.0
30
31
  Requires-Dist: quadkit-contracts>=0.0.2
31
32
  Requires-Dist: structlog<27,>=25.1.0
32
33
  Provides-Extra: codegen
@@ -250,10 +251,10 @@ report vulnerabilities privately per
250
251
 
251
252
  ## Stability
252
253
 
253
- Version `0.0.3` in the `0.x` series, released in lockstep with the
254
+ Version `0.0.42` in the `0.x` series, released in lockstep with the
254
255
  other four distributions; APIs may change between minor versions until
255
256
  1.0 — pin an exact version
256
- (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
257
+ (`quadkit==0.0.42`) or a tight range (`>=0.0.42,<0.1.0`). Full policy:
257
258
  [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
258
259
 
259
260
  ## Links
@@ -199,10 +199,10 @@ report vulnerabilities privately per
199
199
 
200
200
  ## Stability
201
201
 
202
- Version `0.0.3` in the `0.x` series, released in lockstep with the
202
+ Version `0.0.42` in the `0.x` series, released in lockstep with the
203
203
  other four distributions; APIs may change between minor versions until
204
204
  1.0 — pin an exact version
205
- (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
205
+ (`quadkit==0.0.42`) or a tight range (`>=0.0.42,<0.1.0`). Full policy:
206
206
  [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
207
207
 
208
208
  ## Links
@@ -30,7 +30,7 @@ build-backend = "hatchling.build"
30
30
 
31
31
  [project]
32
32
  name = "quadkit"
33
- version = "0.0.4"
33
+ version = "0.0.42"
34
34
  description = "Async-first DI/IoC framework for Python — core package"
35
35
  readme = "README.md"
36
36
  requires-python = ">=3.11"
@@ -74,6 +74,7 @@ dependencies = [
74
74
  "orjson>=3.0.0,<4",
75
75
  "structlog>=25.1.0,<27", # Structured logging foundation
76
76
  "pydantic>=2.10.0,<3", # Required: used unconditionally by config, validation
77
+ "pyyaml>=6.0.0,<7", # Required: YAML config file parsing
77
78
  ]
78
79
 
79
80
  # =============================================================================
@@ -23,6 +23,12 @@ class AppConfig:
23
23
  # ``name`` is the canonical YAML key under ``app:``; ``app_name`` remains
24
24
  # supported for compatibility with the original flat configuration.
25
25
  name: str | None = None
26
+ # ``version`` is the canonical YAML key under ``app:`` (application
27
+ # version string). Declared so apps that pin ``app.version`` in
28
+ # application.yaml bind cleanly — unknown keys raise ConfigSourceError
29
+ # from Application.stop()/get_section().
30
+ version: str = "0.0.0"
31
+ # consumed by: Application — version surfaced in health/telemetry
26
32
  # consumed by: OTEL resource attribute, logger context, AppProvider
27
33
  debug: bool | str = False
28
34
  # consumed by: Application — verbose startup/teardown logging
@@ -1,4 +1,5 @@
1
1
  from quadkit.codegen.base import GeneratorBase
2
+ from quadkit.codegen.field_types import annotation_for, import_lines
2
3
  from quadkit.contracts.cli.generators import GenerationResult
3
4
  from quadkit.contracts.cli.parsers import FieldSpec, parse_fields
4
5
 
@@ -6,5 +7,7 @@ __all__ = [
6
7
  "FieldSpec",
7
8
  "GenerationResult",
8
9
  "GeneratorBase",
10
+ "annotation_for",
11
+ "import_lines",
9
12
  "parse_fields",
10
13
  ]
@@ -0,0 +1,131 @@
1
+ """Field-type vocabulary for the CLI code generators.
2
+
3
+ Field types arrive as free-form identifiers from ``--fields`` strings
4
+ (``order_id:uuid,total:decimal,payload:json``) and generators render them
5
+ straight into annotations -- dataclass fields, Pydantic model fields, function
6
+ signatures. Rendering the token verbatim only
7
+ works while the token happens to be a builtin: ``float`` and ``str`` are fine,
8
+ but ``uuid``, ``datetime``, ``date``, ``time`` and ``json`` are *not* names in
9
+ the generated module, so a payload carrying any of them produced a file that
10
+ raised ``NameError`` on import — the module could not even be collected by
11
+ pytest.
12
+
13
+ Two things have to agree for a field to render correctly, so they live
14
+ together here: the annotation for a token, and the import that annotation
15
+ needs. ``date`` is a ``datetime`` name, ``UUID`` is a ``uuid`` name, and
16
+ ``dict[str, Any]`` needs ``Any`` — an annotation vocabulary without its import
17
+ list is how the original bug happened.
18
+
19
+ Unknown tokens fall back to themselves, matching the SQL vocabulary's stance
20
+ that a typo degrades rather than blocks generation; the difference is that a
21
+ *known* token now always renders a name that exists.
22
+
23
+ This lives in ``quadkit.codegen`` because every generator that renders a field
24
+ already imports from here (``parse_fields`` is the other half of the same
25
+ contract): the vocabulary and the parser that produces its input belong
26
+ together, and a second copy is how the two halves drift apart again.
27
+
28
+ ``quadkit-sql`` keeps its own table: SQLAlchemy columns need a second mapping
29
+ (``String(length=255)``, ``Text``) that has no meaning for a payload.
30
+ """
31
+
32
+ from __future__ import annotations
33
+
34
+ from collections.abc import Iterable
35
+ import re
36
+
37
+ #: Field type → Python annotation for a dataclass field or signature.
38
+ PY_TYPES: dict[str, str] = {
39
+ # Text — an event payload carries values, so URL-ish tokens stay strings:
40
+ # a domain event is a frozen dataclass, not a validated Pydantic model,
41
+ # and importing a validator type for one field would point the dependency
42
+ # the wrong way.
43
+ "str": "str",
44
+ "string": "str",
45
+ "text": "str",
46
+ "slug": "str",
47
+ "char": "str",
48
+ "email": "str",
49
+ "phone": "str",
50
+ "filename": "str",
51
+ "filepath": "str",
52
+ "enum": "str",
53
+ "url": "str",
54
+ "uri": "str",
55
+ "ipv4": "str",
56
+ "ipv6": "str",
57
+ "ip": "str",
58
+ # Numeric
59
+ "int": "int",
60
+ "integer": "int",
61
+ "bigint": "int",
62
+ "smallint": "int",
63
+ "float": "float",
64
+ "double": "float",
65
+ "number": "float",
66
+ "decimal": "float",
67
+ "numeric": "float",
68
+ "money": "float",
69
+ # Boolean and temporal
70
+ "bool": "bool",
71
+ "boolean": "bool",
72
+ "datetime": "datetime",
73
+ "timestamp": "datetime",
74
+ "date": "date",
75
+ "time": "time",
76
+ # Identifiers and structured data
77
+ "uuid": "UUID",
78
+ "json": "dict[str, Any]",
79
+ "jsonb": "dict[str, Any]",
80
+ "dict": "dict[str, Any]",
81
+ "object": "dict[str, Any]",
82
+ "bytes": "bytes",
83
+ "blob": "bytes",
84
+ "binary": "bytes",
85
+ }
86
+
87
+ #: Annotation → the module and name that provide it.
88
+ ANNOTATION_SOURCES: dict[str, tuple[str, str]] = {
89
+ "UUID": ("uuid", "UUID"),
90
+ "datetime": ("datetime", "datetime"),
91
+ "date": ("datetime", "date"),
92
+ "time": ("datetime", "time"),
93
+ "Any": ("typing", "Any"),
94
+ }
95
+
96
+
97
+ def annotation_for(field_type: str) -> str:
98
+ """The Python annotation for a field-spec type token."""
99
+ return PY_TYPES.get(field_type.strip().lower(), field_type.strip())
100
+
101
+
102
+ def import_lines(
103
+ field_types: Iterable[str], *, always: Iterable[str] = ()
104
+ ) -> list[str]:
105
+ """One import line per module needed by the rendered annotations.
106
+
107
+ Args:
108
+ field_types: Raw field-spec tokens from the ``--fields`` string.
109
+ always: Annotations the template renders outside the payload — the
110
+ event template's ``aggregate_id: UUID``, the command and query
111
+ templates' ``Any`` — so they are imported whether or not a field
112
+ happens to ask for them. Templates have no import machinery of
113
+ their own; this is it.
114
+ """
115
+ per_module: dict[str, set[str]] = {}
116
+ for field_type in [*field_types, *always]:
117
+ rendered = annotation_for(field_type)
118
+ # Scan the *rendered annotation* rather than looking the token up in a
119
+ # second table: a composite annotation carries more than one name
120
+ # (``dict[str, Any]`` needs ``Any``), and the names are what the file
121
+ # has to import.
122
+ for name, (module, _) in ANNOTATION_SOURCES.items():
123
+ if re.search(rf"\b{name}\b", rendered):
124
+ per_module.setdefault(module, set()).add(name)
125
+ return [
126
+ f"from {module} import {', '.join(sorted(names))}"
127
+ for module, names in sorted(per_module.items())
128
+ ]
129
+
130
+
131
+ __all__ = ["ANNOTATION_SOURCES", "PY_TYPES", "annotation_for", "import_lines"]
@@ -0,0 +1,68 @@
1
+ """No-op observability provider registered by the Quadkit core framework."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from quadkit.contracts.core.di import (
6
+ ContainerRegistrarProtocol,
7
+ ContainerResolverProtocol,
8
+ )
9
+ from quadkit.contracts.core.health import HealthCheckProtocol
10
+ from quadkit.contracts.observability.metrics import (
11
+ HealthCheckRegistryProtocol,
12
+ MetricsCollectorProtocol,
13
+ MetricsFactoryProtocol,
14
+ MetricsRecorderProtocol,
15
+ )
16
+ from quadkit.contracts.observability.tracing import TracerProtocol
17
+ from quadkit.di.provider import Provider, ProviderPriority
18
+ from quadkit.observability.core import (
19
+ NoOpHealthCheckRegistry,
20
+ NoOpMetricsCollector,
21
+ NoOpTracer,
22
+ )
23
+
24
+
25
+ class ObservabilityProvider(Provider):
26
+ """Provides no-op observability bindings for the core framework."""
27
+
28
+ name = "observability"
29
+ priority = ProviderPriority.INFRASTRUCTURE
30
+
31
+ async def register(self, container: ContainerRegistrarProtocol) -> None:
32
+ """Register the no-op observability implementations.
33
+
34
+ These bindings are fallbacks: they let application code compile and
35
+ run without ``quadkit-monitor``, but they must never win over a real
36
+ implementation. The container overwrites a token with the last
37
+ registration, so registering unconditionally makes the winner depend
38
+ on module composition order — and in nested module graphs this
39
+ provider lands *after* ``MonitorProvider`` and suppresses the concrete
40
+ collector. Guard each token, the same pattern the other fallback
41
+ sites use (``quadkit-auth``, ``quadkit-cache``, ``quadkit-ai-relay``),
42
+ so whichever real implementation registered first survives.
43
+ """
44
+ collector = NoOpMetricsCollector()
45
+ if not container.has(MetricsCollectorProtocol):
46
+ container.singleton(MetricsCollectorProtocol, collector)
47
+ if not container.has(MetricsRecorderProtocol):
48
+ container.singleton(MetricsRecorderProtocol, collector)
49
+ if not container.has(MetricsFactoryProtocol):
50
+ container.singleton(MetricsFactoryProtocol, collector)
51
+
52
+ if not container.has(TracerProtocol):
53
+ container.singleton(TracerProtocol, NoOpTracer())
54
+
55
+ registry = NoOpHealthCheckRegistry()
56
+ if not container.has(HealthCheckRegistryProtocol):
57
+ container.singleton(HealthCheckRegistryProtocol, registry)
58
+ if not container.has(HealthCheckProtocol):
59
+ container.singleton(HealthCheckProtocol, registry)
60
+
61
+ async def boot(self, container: ContainerResolverProtocol) -> None:
62
+ """No boot-time work is required."""
63
+
64
+ async def shutdown(self) -> None:
65
+ """No resources need teardown."""
66
+
67
+
68
+ __all__ = ["ObservabilityProvider"]
@@ -200,6 +200,7 @@ class TestObservabilityProvider:
200
200
 
201
201
  provider = ObservabilityProvider()
202
202
  container = MagicMock()
203
+ container.has.return_value = False
203
204
  await provider.register(container)
204
205
 
205
206
  bound_abstracts = [c.args[0] for c in container.singleton.call_args_list]
@@ -224,6 +225,7 @@ class TestObservabilityProvider:
224
225
  return None
225
226
 
226
227
  container = MagicMock()
228
+ container.has.return_value = False
227
229
  container.singleton = capture_singleton
228
230
 
229
231
  await provider.register(container)
@@ -269,10 +271,53 @@ class TestObservabilityProvider:
269
271
 
270
272
  provider = ObservabilityProvider()
271
273
  container = MagicMock()
274
+ container.has.return_value = False
272
275
  await provider.register(container)
273
276
 
274
277
  assert container.singleton.call_count == 6
275
278
 
279
+ @pytest.mark.asyncio
280
+ async def test_skips_tokens_a_real_implementation_already_holds(self) -> None:
281
+ """Fallback bindings must not overwrite an already-registered token.
282
+
283
+ The container keeps the last registration; an unconditional register
284
+ here let composition order decide the winner, and nested module graphs
285
+ can land the no-op *after* a real implementation.
286
+ """
287
+ from quadkit.observability.di.sub_providers.observability import (
288
+ ObservabilityProvider,
289
+ )
290
+
291
+ provider = ObservabilityProvider()
292
+ container = MagicMock()
293
+ container.has.return_value = True
294
+ await provider.register(container)
295
+
296
+ assert container.singleton.call_count == 0
297
+
298
+ @pytest.mark.asyncio
299
+ async def test_only_missing_tokens_are_filled(self) -> None:
300
+ """A partially populated container gets the remaining five no-ops."""
301
+ from quadkit.observability.di.sub_providers.observability import (
302
+ ObservabilityProvider,
303
+ )
304
+
305
+ provider = ObservabilityProvider()
306
+ container = MagicMock()
307
+ container.has.side_effect = (
308
+ lambda service_type: service_type is MetricsCollectorProtocol
309
+ )
310
+ await provider.register(container)
311
+
312
+ bound_abstracts = [c.args[0] for c in container.singleton.call_args_list]
313
+ assert bound_abstracts == [
314
+ MetricsRecorderProtocol,
315
+ MetricsFactoryProtocol,
316
+ TracerProtocol,
317
+ HealthCheckRegistryProtocol,
318
+ HealthCheckProtocol,
319
+ ]
320
+
276
321
 
277
322
  class TestPackageExports:
278
323
  """Verify the observability package exports the canonical no-op classes."""
@@ -1,52 +0,0 @@
1
- """No-op observability provider registered by the Quadkit core framework."""
2
-
3
- from __future__ import annotations
4
-
5
- from quadkit.contracts.core.di import (
6
- ContainerRegistrarProtocol,
7
- ContainerResolverProtocol,
8
- )
9
- from quadkit.contracts.core.health import HealthCheckProtocol
10
- from quadkit.contracts.observability.metrics import (
11
- HealthCheckRegistryProtocol,
12
- MetricsCollectorProtocol,
13
- MetricsFactoryProtocol,
14
- MetricsRecorderProtocol,
15
- )
16
- from quadkit.contracts.observability.tracing import TracerProtocol
17
- from quadkit.di.provider import Provider, ProviderPriority
18
- from quadkit.observability.core import (
19
- NoOpHealthCheckRegistry,
20
- NoOpMetricsCollector,
21
- NoOpTracer,
22
- )
23
-
24
-
25
- class ObservabilityProvider(Provider):
26
- """Provides no-op observability bindings for the core framework."""
27
-
28
- name = "observability"
29
- priority = ProviderPriority.INFRASTRUCTURE
30
-
31
- async def register(self, container: ContainerRegistrarProtocol) -> None:
32
- """Register the no-op observability implementations."""
33
- collector = NoOpMetricsCollector()
34
- container.singleton(MetricsCollectorProtocol, collector)
35
- container.singleton(MetricsRecorderProtocol, collector)
36
- container.singleton(MetricsFactoryProtocol, collector)
37
-
38
- tracer = NoOpTracer()
39
- container.singleton(TracerProtocol, tracer)
40
-
41
- registry = NoOpHealthCheckRegistry()
42
- container.singleton(HealthCheckRegistryProtocol, registry)
43
- container.singleton(HealthCheckProtocol, registry)
44
-
45
- async def boot(self, container: ContainerResolverProtocol) -> None:
46
- """No boot-time work is required."""
47
-
48
- async def shutdown(self) -> None:
49
- """No resources need teardown."""
50
-
51
-
52
- __all__ = ["ObservabilityProvider"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes