quadkit 0.0.2__tar.gz → 0.0.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (669) hide show
  1. quadkit-0.0.3/.gitignore +24 -0
  2. quadkit-0.0.3/PKG-INFO +179 -0
  3. quadkit-0.0.3/README.md +128 -0
  4. {quadkit-0.0.2 → quadkit-0.0.3}/example.yaml +2 -2
  5. {quadkit-0.0.2 → quadkit-0.0.3}/pyproject.toml +3 -5
  6. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/base.py +3 -1
  7. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/health_probes.py +32 -6
  8. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/module.py +1 -1
  9. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/base.py +3 -1
  10. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container.py +52 -21
  11. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/registrar.py +26 -0
  12. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/decorators.py +7 -0
  13. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/discovery.py +1 -1
  14. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/function_provider.py +16 -7
  15. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/lifecycle.py +20 -5
  16. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/registry.py +17 -0
  17. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/resolver.py +5 -3
  18. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/unit_of_work.py +1 -1
  19. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/configurator.py +1 -1
  20. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/processors.py +1 -1
  21. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/resilience.py +1 -1
  22. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/core.py +1 -1
  23. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context_registry.py +15 -0
  24. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/pipeline.py +1 -1
  25. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/introspection.py +1 -1
  26. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_generator_base.py +3 -33
  27. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_template_overrides.py +3 -3
  28. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_exceptions.py +7 -0
  29. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_env_interpolation.py +1 -1
  30. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_logging_sampling.py +13 -11
  31. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_secrets_validator.py +1 -1
  32. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_strict_sections.py +19 -3
  33. quadkit-0.0.3/tests/unit/di/test_function_provider_boot.py +68 -0
  34. quadkit-0.0.3/tests/unit/di/test_module_visibility_boot.py +116 -0
  35. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_config_injection.py +1 -1
  36. quadkit-0.0.3/tests/unit/test_app_health_baseline.py +81 -0
  37. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config.py +13 -0
  38. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_context_registry.py +26 -0
  39. quadkit-0.0.2/.gitignore +0 -190
  40. quadkit-0.0.2/PKG-INFO +0 -157
  41. quadkit-0.0.2/README.md +0 -106
  42. {quadkit-0.0.2 → quadkit-0.0.3}/CHANGELOG.md +0 -0
  43. {quadkit-0.0.2 → quadkit-0.0.3}/LICENSE +0 -0
  44. {quadkit-0.0.2 → quadkit-0.0.3}/NOTICE +0 -0
  45. {quadkit-0.0.2 → quadkit-0.0.3}/src/import_error.txt +0 -0
  46. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/__init__.py +0 -0
  47. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/__init__.py +0 -0
  48. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/asgi_lifespan.py +0 -0
  49. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/__init__.py +0 -0
  50. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/discovery.py +0 -0
  51. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/models.py +0 -0
  52. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config_validation.py +0 -0
  53. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/constants.py +0 -0
  54. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/di/__init__.py +0 -0
  55. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/di/provider.py +0 -0
  56. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/discovery.py +0 -0
  57. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/events.py +0 -0
  58. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/exceptions.py +0 -0
  59. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/factory.py +0 -0
  60. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/injectable_provider.py +0 -0
  61. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/invoker.py +0 -0
  62. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/lifecycle.py +0 -0
  63. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/pipeline.py +0 -0
  64. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/protocols.py +0 -0
  65. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/py.typed +0 -0
  66. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/runner.py +0 -0
  67. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/secrets.py +0 -0
  68. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/standard.py +0 -0
  69. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/types.py +0 -0
  70. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/codegen/__init__.py +0 -0
  71. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/codegen/base.py +0 -0
  72. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/__init__.py +0 -0
  73. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/__init__.py +0 -0
  74. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/py.typed +0 -0
  75. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
  76. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/__init__.py +0 -0
  77. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/channel.py +0 -0
  78. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/py.typed +0 -0
  79. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/config.py +0 -0
  80. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/constants.py +0 -0
  81. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/__init__.py +0 -0
  82. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/provider.py +0 -0
  83. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/py.typed +0 -0
  84. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/exceptions.py +0 -0
  85. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/__init__.py +0 -0
  86. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
  87. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/parallel.py +0 -0
  88. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/py.typed +0 -0
  89. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/task_manager.py +0 -0
  90. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/__init__.py +0 -0
  91. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/py.typed +0 -0
  92. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/rwlock.py +0 -0
  93. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/module.py +0 -0
  94. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/py.typed +0 -0
  95. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/task_utils.py +0 -0
  96. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/__init__.py +0 -0
  97. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/constants.py +0 -0
  98. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/di/__init__.py +0 -0
  99. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/di/provider.py +0 -0
  100. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/exceptions.py +0 -0
  101. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/__init__.py +0 -0
  102. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/merge.py +0 -0
  103. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/registry.py +0 -0
  104. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/sources.py +0 -0
  105. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/validation.py +0 -0
  106. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/watcher.py +0 -0
  107. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/main.py +0 -0
  108. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/protocols.py +0 -0
  109. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/secrets.py +0 -0
  110. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/types.py +0 -0
  111. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/constants.py +0 -0
  112. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/__init__.py +0 -0
  113. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/_graph.py +0 -0
  114. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/builder.py +0 -0
  115. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/config/__init__.py +0 -0
  116. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/config/models.py +0 -0
  117. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/constants.py +0 -0
  118. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/__init__.py +0 -0
  119. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container_introspection.py +0 -0
  120. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container_runtime.py +0 -0
  121. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/resolver.py +0 -0
  122. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/scope.py +0 -0
  123. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/validation.py +0 -0
  124. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/context.py +0 -0
  125. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/exceptions.py +0 -0
  126. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/__init__.py +0 -0
  127. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
  128. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/interceptors.py +0 -0
  129. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/strategies.py +0 -0
  130. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/validator.py +0 -0
  131. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/integration/__init__.py +0 -0
  132. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/integration/provider.py +0 -0
  133. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/markers.py +0 -0
  134. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/__init__.py +0 -0
  135. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/base.py +0 -0
  136. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/__init__.py +0 -0
  137. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
  138. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/compiler.py +0 -0
  139. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/context.py +0 -0
  140. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
  141. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/collect.py +0 -0
  142. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
  143. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
  144. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/order.py +0 -0
  145. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
  146. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
  147. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
  148. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/constants.py +0 -0
  149. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/decorator.py +0 -0
  150. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/dynamic.py +0 -0
  151. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/errors.py +0 -0
  152. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/graph.py +0 -0
  153. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/introspection.py +0 -0
  154. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/metadata.py +0 -0
  155. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/registry.py +0 -0
  156. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/__init__.py +0 -0
  157. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/events.py +0 -0
  158. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/health.py +0 -0
  159. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
  160. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/registry.py +0 -0
  161. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/protocols.py +0 -0
  162. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/provider.py +0 -0
  163. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/provider_utils.py +0 -0
  164. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/py.typed +0 -0
  165. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/__init__.py +0 -0
  166. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/context.py +0 -0
  167. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/descriptor.py +0 -0
  168. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/diagnostics.py +0 -0
  169. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/injector.py +0 -0
  170. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/invoker.py +0 -0
  171. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/store.py +0 -0
  172. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/type_hints.py +0 -0
  173. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/validator.py +0 -0
  174. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/types.py +0 -0
  175. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/__init__.py +0 -0
  176. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/config.py +0 -0
  177. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/constants.py +0 -0
  178. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/exceptions.py +0 -0
  179. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/__init__.py +0 -0
  180. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/aggregate.py +0 -0
  181. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/base.py +0 -0
  182. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/coercion.py +0 -0
  183. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/entity.py +0 -0
  184. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/factory.py +0 -0
  185. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/py.typed +0 -0
  186. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/value_object.py +0 -0
  187. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/module.py +0 -0
  188. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/py.typed +0 -0
  189. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/types.py +0 -0
  190. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/exceptions.py +0 -0
  191. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/__init__.py +0 -0
  192. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/ambient.py +0 -0
  193. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/registry.py +0 -0
  194. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/types.py +0 -0
  195. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/__init__.py +0 -0
  196. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/ambient.py +0 -0
  197. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/config.py +0 -0
  198. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/constants.py +0 -0
  199. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/di/__init__.py +0 -0
  200. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/di/provider.py +0 -0
  201. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/generator.py +0 -0
  202. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/README.md +0 -0
  203. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/__init__.py +0 -0
  204. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/__init__.py +0 -0
  205. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/models.py +0 -0
  206. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/redaction.py +0 -0
  207. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/sampling.py +0 -0
  208. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/constants.py +0 -0
  209. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/debug.py +0 -0
  210. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/di/__init__.py +0 -0
  211. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/di/provider.py +0 -0
  212. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/factory.py +0 -0
  213. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/redaction.py +0 -0
  214. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/types.py +0 -0
  215. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/__init__.py +0 -0
  216. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/config.py +0 -0
  217. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/constants.py +0 -0
  218. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/core/__init__.py +0 -0
  219. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/core/mapper.py +0 -0
  220. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/di/__init__.py +0 -0
  221. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/di/provider.py +0 -0
  222. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/exceptions.py +0 -0
  223. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/module.py +0 -0
  224. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/protocols.py +0 -0
  225. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/py.typed +0 -0
  226. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/types.py +0 -0
  227. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/__init__.py +0 -0
  228. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/__init__.py +0 -0
  229. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/caching.py +0 -0
  230. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/di.py +0 -0
  231. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/observability.py +0 -0
  232. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/routing.py +0 -0
  233. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/validation.py +0 -0
  234. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/config.py +0 -0
  235. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/constants.py +0 -0
  236. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/__init__.py +0 -0
  237. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/chain.py +0 -0
  238. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/exception_filters.py +0 -0
  239. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/registry.py +0 -0
  240. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/di/__init__.py +0 -0
  241. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/di/provider.py +0 -0
  242. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/exceptions.py +0 -0
  243. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/module.py +0 -0
  244. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/types.py +0 -0
  245. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/module.py +0 -0
  246. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/__init__.py +0 -0
  247. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/__init__.py +0 -0
  248. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
  249. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
  250. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/__init__.py +0 -0
  251. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/discovery.py +0 -0
  252. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/engine.py +0 -0
  253. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/exceptions.py +0 -0
  254. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/module.py +0 -0
  255. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/state.py +0 -0
  256. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/__init__.py +0 -0
  257. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/builder.py +0 -0
  258. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/clock.py +0 -0
  259. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/constants.py +0 -0
  260. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context.py +0 -0
  261. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context_keys.py +0 -0
  262. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/data.py +0 -0
  263. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/di/__init__.py +0 -0
  264. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/di/provider.py +0 -0
  265. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/exceptions.py +0 -0
  266. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/lazy.py +0 -0
  267. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/protocols.py +0 -0
  268. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/__init__.py +0 -0
  269. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/core.py +0 -0
  270. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/trusted_html.py +0 -0
  271. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/types.py +0 -0
  272. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/typing.py +0 -0
  273. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/py.typed +0 -0
  274. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/__init__.py +0 -0
  275. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/core.py +0 -0
  276. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/exceptions.py +0 -0
  277. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/__init__.py +0 -0
  278. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/control.py +0 -0
  279. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/time_ops.py +0 -0
  280. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/transform.py +0 -0
  281. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/retry.py +0 -0
  282. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/subjects.py +0 -0
  283. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/__init__.py +0 -0
  284. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/_pipeline.py +0 -0
  285. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/errors.py +0 -0
  286. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/types.py +0 -0
  287. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/utils.py +0 -0
  288. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/__init__.py +0 -0
  289. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/base.py +0 -0
  290. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/canonical_json.py +0 -0
  291. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/content_addressed.py +0 -0
  292. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/__init__.py +0 -0
  293. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/config.py +0 -0
  294. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/constants.py +0 -0
  295. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/decorators.py +0 -0
  296. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/encryption/__init__.py +0 -0
  297. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/encryption/service.py +0 -0
  298. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/events.py +0 -0
  299. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/exceptions.py +0 -0
  300. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/__init__.py +0 -0
  301. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/chain.py +0 -0
  302. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/decorator.py +0 -0
  303. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/__init__.py +0 -0
  304. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/ambient.py +0 -0
  305. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/digest.py +0 -0
  306. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/kdf.py +0 -0
  307. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hooks.py +0 -0
  308. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/protocols.py +0 -0
  309. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/provider.py +0 -0
  310. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/py.typed +0 -0
  311. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/__init__.py +0 -0
  312. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/filename.py +0 -0
  313. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/html.py +0 -0
  314. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/sanitizer.py +0 -0
  315. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/url.py +0 -0
  316. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/__init__.py +0 -0
  317. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/rotation.py +0 -0
  318. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/store.py +0 -0
  319. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/types.py +0 -0
  320. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/types.py +0 -0
  321. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/__init__.py +0 -0
  322. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/__init__.py +0 -0
  323. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/json.py +0 -0
  324. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/py.typed +0 -0
  325. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/config.py +0 -0
  326. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/constants.py +0 -0
  327. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/__init__.py +0 -0
  328. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/provider.py +0 -0
  329. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/py.typed +0 -0
  330. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/__init__.py +0 -0
  331. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/domain.py +0 -0
  332. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/py.typed +0 -0
  333. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/exceptions.py +0 -0
  334. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/module.py +0 -0
  335. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/py.typed +0 -0
  336. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/__init__.py +0 -0
  337. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/py.typed +0 -0
  338. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/registry.py +0 -0
  339. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/__init__.py +0 -0
  340. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/py.typed +0 -0
  341. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/schema.py +0 -0
  342. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/types.py +0 -0
  343. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/types.py +0 -0
  344. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/__init__.py +0 -0
  345. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/config.py +0 -0
  346. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/constants.py +0 -0
  347. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/decorators.py +0 -0
  348. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/__init__.py +0 -0
  349. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/coercion.py +0 -0
  350. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/py.typed +0 -0
  351. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/validator.py +0 -0
  352. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/exceptions.py +0 -0
  353. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/module.py +0 -0
  354. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/py.typed +0 -0
  355. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/__init__.py +0 -0
  356. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/py.typed +0 -0
  357. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/rules.py +0 -0
  358. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/__init__.py +0 -0
  359. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/fields.py +0 -0
  360. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/introspection.py +0 -0
  361. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/py.typed +0 -0
  362. {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/types.py +0 -0
  363. {quadkit-0.0.2 → quadkit-0.0.3}/tests/conftest.py +0 -0
  364. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/__init__.py +0 -0
  365. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/__init__.py +0 -0
  366. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/_fixtures.py +0 -0
  367. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/conftest.py +0 -0
  368. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_boot_level.py +0 -0
  369. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_cross_method.py +0 -0
  370. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_dependency_chain.py +0 -0
  371. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_exports.py +0 -0
  372. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_importers.py +0 -0
  373. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_module_health_integration.py +0 -0
  374. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
  375. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_name_lookup.py +0 -0
  376. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
  377. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
  378. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
  379. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
  380. {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/test_full_pipeline.py +0 -0
  381. {quadkit-0.0.2 → quadkit-0.0.3}/tests/test.md +0 -0
  382. {quadkit-0.0.2 → quadkit-0.0.3}/tests/test_import_diagnostic.py +0 -0
  383. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/__init__.py +0 -0
  384. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/aop/test_interceptor_timeout.py +0 -0
  385. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/clock/test_clock.py +0 -0
  386. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/__init__.py +0 -0
  387. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_staged_generation.py +0 -0
  388. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/conftest.py +0 -0
  389. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_bounded_channel.py +0 -0
  390. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_channel.py +0 -0
  391. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_config.py +0 -0
  392. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
  393. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
  394. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
  395. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
  396. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
  397. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_config_pool.py +0 -0
  398. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_dispatcher.py +0 -0
  399. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_sync_bridge.py +0 -0
  400. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_task_manager.py +0 -0
  401. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_task_utils.py +0 -0
  402. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_constants_new.py +0 -0
  403. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_protocols.py +0 -0
  404. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_sources.py +0 -0
  405. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_loader_fail_fast.py +0 -0
  406. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_logging_redaction_config.py +0 -0
  407. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_profile_overlay.py +0 -0
  408. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_scoping.py +0 -0
  409. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_strict_bool_env.py +0 -0
  410. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_context_correlation.py +0 -0
  411. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_core_constants.py +0 -0
  412. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_core_types.py +0 -0
  413. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_request_context_di.py +0 -0
  414. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_typing.py +0 -0
  415. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/validation/test_protocols.py +0 -0
  416. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/__init__.py +0 -0
  417. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/integration/test_provider.py +0 -0
  418. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/__init__.py +0 -0
  419. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/conftest.py +0 -0
  420. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_compiler.py +0 -0
  421. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_decorator.py +0 -0
  422. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_dynamic.py +0 -0
  423. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_errors.py +0 -0
  424. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_global.py +0 -0
  425. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_graph_reflection.py +0 -0
  426. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_health_graph.py +0 -0
  427. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_integration.py +0 -0
  428. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_introspection.py +0 -0
  429. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_lifecycle.py +0 -0
  430. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_module_lifecycle.py +0 -0
  431. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_reexport.py +0 -0
  432. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_registry.py +0 -0
  433. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_stub_compiler.py +0 -0
  434. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_stub_decorator.py +0 -0
  435. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_visibility.py +0 -0
  436. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_advanced_features.py +0 -0
  437. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_basics.py +0 -0
  438. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_builder.py +0 -0
  439. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_freeze.py +0 -0
  440. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_hardening.py +0 -0
  441. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_visibility.py +0 -0
  442. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_decorators.py +0 -0
  443. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_descriptor.py +0 -0
  444. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_constants_new.py +0 -0
  445. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_decorators.py +0 -0
  446. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
  447. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_diagnostics.py +0 -0
  448. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_extensions_discovery.py +0 -0
  449. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_extensions_validator.py +0 -0
  450. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_graph_validator.py +0 -0
  451. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_interceptor_registry.py +0 -0
  452. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_invoker_unit.py +0 -0
  453. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
  454. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_module_validation.py +0 -0
  455. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
  456. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_named_binding.py +0 -0
  457. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_orchestrator_health.py +0 -0
  458. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_basics.py +0 -0
  459. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_conformance.py +0 -0
  460. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_orchestration.py +0 -0
  461. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_reset_state.py +0 -0
  462. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_utils.py +0 -0
  463. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_scope_concurrency.py +0 -0
  464. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_scope_manager.py +0 -0
  465. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_service_store.py +0 -0
  466. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_type_hints.py +0 -0
  467. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_validation.py +0 -0
  468. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/conftest.py +0 -0
  469. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_aggregates.py +0 -0
  470. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain.py +0 -0
  471. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_constants.py +0 -0
  472. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_exceptions.py +0 -0
  473. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_init.py +0 -0
  474. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_model_strict.py +0 -0
  475. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_module.py +0 -0
  476. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_models_factory.py +0 -0
  477. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_value_object.py +0 -0
  478. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/identity/test_identity.py +0 -0
  479. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/logging/test_logging_constants_new.py +0 -0
  480. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/conftest.py +0 -0
  481. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_auto_map.py +0 -0
  482. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_exceptions.py +0 -0
  483. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
  484. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
  485. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_mapper.py +0 -0
  486. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_module.py +0 -0
  487. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_types.py +0 -0
  488. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_protocol.py +0 -0
  489. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_registry.py +0 -0
  490. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/conftest.py +0 -0
  491. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_builtins.py +0 -0
  492. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_chain.py +0 -0
  493. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_config_alignment.py +0 -0
  494. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_exception_filters.py +0 -0
  495. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_chain.py +0 -0
  496. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_constants.py +0 -0
  497. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
  498. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
  499. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
  500. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_module.py +0 -0
  501. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_routing.py +0 -0
  502. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_types.py +0 -0
  503. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
  504. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_registry_defaults.py +0 -0
  505. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
  506. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_discovery.py +0 -0
  507. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_engine.py +0 -0
  508. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_state.py +0 -0
  509. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_state_hardening.py +0 -0
  510. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_validation.py +0 -0
  511. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_primitives_constants.py +0 -0
  512. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_registry_advanced.py +0 -0
  513. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_registry_introspection.py +0 -0
  514. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_trusted_html.py +0 -0
  515. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_control.py +0 -0
  516. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_core.py +0 -0
  517. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_facade.py +0 -0
  518. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_retry.py +0 -0
  519. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_subjects.py +0 -0
  520. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_time_ops.py +0 -0
  521. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_transform.py +0 -0
  522. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/__init__.py +0 -0
  523. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_exceptions.py +0 -0
  524. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_guards.py +0 -0
  525. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_hashing.py +0 -0
  526. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_package_hooks_p2.py +0 -0
  527. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secret_rotation_policy.py +0 -0
  528. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secrets_rotation.py +0 -0
  529. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secrets_store.py +0 -0
  530. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_api.py +0 -0
  531. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_components_p2.py +0 -0
  532. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_constants.py +0 -0
  533. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_exceptions.py +0 -0
  534. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_types.py +0 -0
  535. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/conftest.py +0 -0
  536. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_schema.py +0 -0
  537. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_constants.py +0 -0
  538. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
  539. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_domain.py +0 -0
  540. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_init.py +0 -0
  541. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_json.py +0 -0
  542. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_registry.py +0 -0
  543. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_types.py +0 -0
  544. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_boot_validation.py +0 -0
  545. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_config_and_misc.py +0 -0
  546. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_constants.py +0 -0
  547. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_discovery.py +0 -0
  548. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_health_config.py +0 -0
  549. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_runner_and_lifespan.py +0 -0
  550. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_types.py +0 -0
  551. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_validation_and_misc.py +0 -0
  552. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application.py +0 -0
  553. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application_base.py +0 -0
  554. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application_lifecycle.py +0 -0
  555. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_base_and_misc_exceptions.py +0 -0
  556. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
  557. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_codegen.py +0 -0
  558. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_compiler_graph_utils.py +0 -0
  559. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_component_exceptions.py +0 -0
  560. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_concurrency_constants.py +0 -0
  561. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_concurrency_exceptions.py +0 -0
  562. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_constants.py +0 -0
  563. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_hardening.py +0 -0
  564. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_quadkit.py +0 -0
  565. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_requirements.py +0 -0
  566. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_sources.py +0 -0
  567. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_types.py +0 -0
  568. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_watcher.py +0 -0
  569. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_exceptions.py +0 -0
  570. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_introspection.py +0 -0
  571. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_override.py +0 -0
  572. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_resolver_impl.py +0 -0
  573. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_runtime_mixin.py +0 -0
  574. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_contract_completeness.py +0 -0
  575. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_builder.py +0 -0
  576. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_constants.py +0 -0
  577. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_lazy.py +0 -0
  578. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_module.py +0 -0
  579. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_pipeline.py +0 -0
  580. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_dependency_injector.py +0 -0
  581. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_constants.py +0 -0
  582. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_descriptor.py +0 -0
  583. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_module_constants.py +0 -0
  584. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_constants.py +0 -0
  585. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_exceptions.py +0 -0
  586. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_model_base.py +0 -0
  587. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_dynamic_module.py +0 -0
  588. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_events_security_exceptions.py +0 -0
  589. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_execution_result.py +0 -0
  590. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hatch_build_targets.py +0 -0
  591. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_health_probes.py +0 -0
  592. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry.py +0 -0
  593. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_edge_cases.py +0 -0
  594. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_introspection.py +0 -0
  595. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_scenarios.py +0 -0
  596. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_identity_generators_and_ambient.py +0 -0
  597. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_infra_exceptions.py +0 -0
  598. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_input_sanitizers.py +0 -0
  599. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_interceptors.py +0 -0
  600. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_json_serialization_backend.py +0 -0
  601. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_apply_redaction.py +0 -0
  602. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_bridging.py +0 -0
  603. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_constants.py +0 -0
  604. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_debug.py +0 -0
  605. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_di_provider.py +0 -0
  606. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_factory.py +0 -0
  607. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_init.py +0 -0
  608. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_redaction.py +0 -0
  609. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_redaction_compound.py +0 -0
  610. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_types.py +0 -0
  611. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_m13_m14_verification.py +0 -0
  612. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapper.py +0 -0
  613. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapper_enhanced.py +0 -0
  614. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapping.py +0 -0
  615. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_enhancements.py +0 -0
  616. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_exceptions.py +0 -0
  617. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_new.py +0 -0
  618. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_decorator.py +0 -0
  619. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_scan_and_provide.py +0 -0
  620. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_system.py +0 -0
  621. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_no_db_imports.py +0 -0
  622. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_observability.py +0 -0
  623. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_orchestrator_parallel.py +0 -0
  624. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_p2_scope_log_level.py +0 -0
  625. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_context.py +0 -0
  626. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_data.py +0 -0
  627. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_registry.py +0 -0
  628. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_provider_boot_enhanced.py +0 -0
  629. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_provider_decorator.py +0 -0
  630. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_quadkit_constants.py +0 -0
  631. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_quadkit_exceptions.py +0 -0
  632. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_repr_helpers.py +0 -0
  633. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_resilience_exceptions.py +0 -0
  634. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_combinators.py +0 -0
  635. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_core.py +0 -0
  636. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_pipeline.py +0 -0
  637. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_pipeline_and_utils.py +0 -0
  638. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_types_new.py +0 -0
  639. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_utils.py +0 -0
  640. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_round22_hardening.py +0 -0
  641. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_round41_hardening.py +0 -0
  642. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_saga_primitives.py +0 -0
  643. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_sampling_and_config.py +0 -0
  644. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_secret_stores_and_rotation.py +0 -0
  645. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_serialization_constants.py +0 -0
  646. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_serialization_exceptions.py +0 -0
  647. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_service_descriptor.py +0 -0
  648. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_structured_logging.py +0 -0
  649. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_time_ops.py +0 -0
  650. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_types.py +0 -0
  651. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_coercion.py +0 -0
  652. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_exceptions.py +0 -0
  653. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_rules.py +0 -0
  654. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_validator_engine.py +0 -0
  655. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/__init__.py +0 -0
  656. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/conftest.py +0 -0
  657. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_async_validator.py +0 -0
  658. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_coercion.py +0 -0
  659. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_helpers.py +0 -0
  660. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation.py +0 -0
  661. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_constants.py +0 -0
  662. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_constants_new.py +0 -0
  663. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_fields.py +0 -0
  664. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_fields_extended.py +0 -0
  665. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_init.py +0 -0
  666. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_introspection.py +0 -0
  667. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_module.py +0 -0
  668. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_types.py +0 -0
  669. {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validator.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/
quadkit-0.0.3/PKG-INFO ADDED
@@ -0,0 +1,179 @@
1
+ Metadata-Version: 2.5
2
+ Name: quadkit
3
+ Version: 0.0.3
4
+ Summary: Async-first DI/IoC framework for Python — core package
5
+ Project-URL: Homepage, https://quadkit.dev
6
+ Project-URL: Repository, https://github.com/dbtinoy-/quadkit
7
+ Project-URL: Documentation, https://quadkit.dev
8
+ Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
9
+ Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
10
+ Author-email: Quadkit Framework Team <team@quadkit.dev>
11
+ Maintainer-email: Quadkit Framework Team <team@quadkit.dev>
12
+ License: Apache-2.0
13
+ License-File: LICENSE
14
+ License-File: NOTICE
15
+ Keywords: async,dependency-injection,framework,ioc,provider-pattern
16
+ Classifier: Development Status :: 3 - Alpha
17
+ Classifier: Framework :: AsyncIO
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: License :: OSI Approved :: Apache Software License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.11
28
+ Requires-Dist: orjson>=3.0.0
29
+ Requires-Dist: pydantic>=2.10.0
30
+ Requires-Dist: quadkit-contracts>=0.0.2
31
+ Requires-Dist: structlog<27,>=25.1.0
32
+ Provides-Extra: codegen
33
+ Requires-Dist: jinja2>=3.1.0; extra == 'codegen'
34
+ Provides-Extra: dev
35
+ Requires-Dist: mypy>=1.0.0; extra == 'dev'
36
+ Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
37
+ Requires-Dist: ruff>=0.16.4; extra == 'dev'
38
+ Provides-Extra: docs
39
+ Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
40
+ Requires-Dist: mkdocs>=1.4.0; extra == 'docs'
41
+ Provides-Extra: security
42
+ Requires-Dist: cryptography>=41.0.0; extra == 'security'
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
45
+ Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
46
+ Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
47
+ Requires-Dist: pytest>=8.0.0; extra == 'test'
48
+ Provides-Extra: web
49
+ Requires-Dist: quadkit-web[granian]>=0.0.2; extra == 'web'
50
+ Description-Content-Type: text/markdown
51
+
52
+ # quadkit
53
+
54
+ Async-first application framework for Python: dependency-injection
55
+ container, application lifecycle, typed configuration, and the `Result`
56
+ error model. This is the core package; everything else published from
57
+ this repository builds on it.
58
+
59
+ For application developers — write providers and modules, bind
60
+ contracts, and let one container boot them in order.
61
+
62
+ ## Installation
63
+
64
+ ```bash
65
+ uv add quadkit
66
+ # batteries-included web stack:
67
+ uv add "quadkit[web]"
68
+ ```
69
+
70
+ Requires **Python >= 3.11**.
71
+
72
+ ## Minimal working example
73
+
74
+ ```python
75
+ import asyncio
76
+
77
+ from quadkit import Application
78
+ from quadkit.contracts.core.di import ContainerRegistrarProtocol
79
+ from quadkit.di.provider import Provider
80
+
81
+
82
+ class Settings:
83
+ greeting = "hello, quadkit"
84
+
85
+
86
+ class SettingsProvider(Provider):
87
+ async def register(self, container: ContainerRegistrarProtocol) -> None:
88
+ container.singleton(Settings, instance=Settings())
89
+
90
+
91
+ async def main() -> None:
92
+ app = Application()
93
+ app.add_provider(SettingsProvider())
94
+ await app.start()
95
+ try:
96
+ settings = await app.container.resolve(Settings)
97
+ print(settings.greeting)
98
+ finally:
99
+ await app.stop()
100
+
101
+
102
+ asyncio.run(main())
103
+ ```
104
+
105
+ For the web quickstart (a real endpoint in minutes), see
106
+ [the docs](../../docs/getting-started/first-app.md).
107
+
108
+ ## Optional extras
109
+
110
+ | Extra | Contents |
111
+ | --- | --- |
112
+ | `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
113
+ | `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
114
+ | `quadkit[security]` | `cryptography` (signing/token helpers) |
115
+ | `quadkit[codegen]` | code generation toolchain |
116
+ | `quadkit[docs]` / `[dev]` | documentation / development tooling |
117
+
118
+ ## Public API entry points
119
+
120
+ ```python
121
+ from quadkit import Application, Result, Ok, Err
122
+ from quadkit.di.provider import Provider
123
+ from quadkit.di.container import Container
124
+ from quadkit.logging import get_logger
125
+ from quadkit.contracts.core.di import (
126
+ ContainerRegistrarProtocol,
127
+ ContainerResolverProtocol,
128
+ )
129
+ ```
130
+
131
+ Concepts: [contracts](../../docs/concepts/contracts.md) ·
132
+ [dependency injection](../../docs/concepts/dependency-injection.md) ·
133
+ [modules](../../docs/concepts/modules.md) ·
134
+ [lifecycle](../../docs/concepts/lifecycle.md) ·
135
+ [async model](../../docs/concepts/async-model.md).
136
+
137
+ ## Configuration
138
+
139
+ `application.yaml` at the working directory, validated against typed
140
+ config models at boot (unknown keys fail fast); application metadata
141
+ lives at the root (`name`, `version`, `description`); every typed key
142
+ overrides from the environment with `QK_<SECTION>__<KEY>`. Use
143
+ `QK_PROFILE` to select a profile. See
144
+ [configuration](../../docs/getting-started/configuration.md).
145
+
146
+ ## Error handling
147
+
148
+ `Result[T, E]` for expected domain failures; the
149
+ `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
150
+ NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
151
+ else. The web layer renders both as problem responses — see
152
+ [error handling](../../docs/guides/error-handling.md).
153
+
154
+ ## Testing
155
+
156
+ Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
157
+ your application in-process (with `overrides={Contract: fake}` for test
158
+ doubles), no server required. See
159
+ [testing](../../docs/getting-started/testing.md).
160
+
161
+ ## Security
162
+
163
+ Never put secrets in `application.yaml` — pass them through `QK_*`
164
+ environment variables or a secret store. Unexpected exceptions never
165
+ leak internals to clients. See
166
+ [secure configuration](../../docs/security/secure-configuration.md) and
167
+ report vulnerabilities privately per
168
+ [SECURITY.md](../../SECURITY.md).
169
+
170
+ ## Stability
171
+
172
+ Version `0.0.3` in the `0.x` series, released in lockstep with the
173
+ other four distributions; APIs may change between minor versions until
174
+ 1.0 — pin an exact version
175
+ (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
176
+ [stability and compatibility](../../docs/reference/stability.md).
177
+
178
+ Changelog: [`CHANGELOG.md`](./CHANGELOG.md) ·
179
+ Issues: <https://github.com/dbtinoy-/quadkit/issues>
@@ -0,0 +1,128 @@
1
+ # quadkit
2
+
3
+ Async-first application framework for Python: dependency-injection
4
+ container, application lifecycle, typed configuration, and the `Result`
5
+ error model. This is the core package; everything else published from
6
+ this repository builds on it.
7
+
8
+ For application developers — write providers and modules, bind
9
+ contracts, and let one container boot them in order.
10
+
11
+ ## Installation
12
+
13
+ ```bash
14
+ uv add quadkit
15
+ # batteries-included web stack:
16
+ uv add "quadkit[web]"
17
+ ```
18
+
19
+ Requires **Python >= 3.11**.
20
+
21
+ ## Minimal working example
22
+
23
+ ```python
24
+ import asyncio
25
+
26
+ from quadkit import Application
27
+ from quadkit.contracts.core.di import ContainerRegistrarProtocol
28
+ from quadkit.di.provider import Provider
29
+
30
+
31
+ class Settings:
32
+ greeting = "hello, quadkit"
33
+
34
+
35
+ class SettingsProvider(Provider):
36
+ async def register(self, container: ContainerRegistrarProtocol) -> None:
37
+ container.singleton(Settings, instance=Settings())
38
+
39
+
40
+ async def main() -> None:
41
+ app = Application()
42
+ app.add_provider(SettingsProvider())
43
+ await app.start()
44
+ try:
45
+ settings = await app.container.resolve(Settings)
46
+ print(settings.greeting)
47
+ finally:
48
+ await app.stop()
49
+
50
+
51
+ asyncio.run(main())
52
+ ```
53
+
54
+ For the web quickstart (a real endpoint in minutes), see
55
+ [the docs](../../docs/getting-started/first-app.md).
56
+
57
+ ## Optional extras
58
+
59
+ | Extra | Contents |
60
+ | --- | --- |
61
+ | `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
62
+ | `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
63
+ | `quadkit[security]` | `cryptography` (signing/token helpers) |
64
+ | `quadkit[codegen]` | code generation toolchain |
65
+ | `quadkit[docs]` / `[dev]` | documentation / development tooling |
66
+
67
+ ## Public API entry points
68
+
69
+ ```python
70
+ from quadkit import Application, Result, Ok, Err
71
+ from quadkit.di.provider import Provider
72
+ from quadkit.di.container import Container
73
+ from quadkit.logging import get_logger
74
+ from quadkit.contracts.core.di import (
75
+ ContainerRegistrarProtocol,
76
+ ContainerResolverProtocol,
77
+ )
78
+ ```
79
+
80
+ Concepts: [contracts](../../docs/concepts/contracts.md) ·
81
+ [dependency injection](../../docs/concepts/dependency-injection.md) ·
82
+ [modules](../../docs/concepts/modules.md) ·
83
+ [lifecycle](../../docs/concepts/lifecycle.md) ·
84
+ [async model](../../docs/concepts/async-model.md).
85
+
86
+ ## Configuration
87
+
88
+ `application.yaml` at the working directory, validated against typed
89
+ config models at boot (unknown keys fail fast); application metadata
90
+ lives at the root (`name`, `version`, `description`); every typed key
91
+ overrides from the environment with `QK_<SECTION>__<KEY>`. Use
92
+ `QK_PROFILE` to select a profile. See
93
+ [configuration](../../docs/getting-started/configuration.md).
94
+
95
+ ## Error handling
96
+
97
+ `Result[T, E]` for expected domain failures; the
98
+ `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
99
+ NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
100
+ else. The web layer renders both as problem responses — see
101
+ [error handling](../../docs/guides/error-handling.md).
102
+
103
+ ## Testing
104
+
105
+ Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
106
+ your application in-process (with `overrides={Contract: fake}` for test
107
+ doubles), no server required. See
108
+ [testing](../../docs/getting-started/testing.md).
109
+
110
+ ## Security
111
+
112
+ Never put secrets in `application.yaml` — pass them through `QK_*`
113
+ environment variables or a secret store. Unexpected exceptions never
114
+ leak internals to clients. See
115
+ [secure configuration](../../docs/security/secure-configuration.md) and
116
+ report vulnerabilities privately per
117
+ [SECURITY.md](../../SECURITY.md).
118
+
119
+ ## Stability
120
+
121
+ Version `0.0.3` in the `0.x` series, released in lockstep with the
122
+ other four distributions; APIs may change between minor versions until
123
+ 1.0 — pin an exact version
124
+ (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
125
+ [stability and compatibility](../../docs/reference/stability.md).
126
+
127
+ Changelog: [`CHANGELOG.md`](./CHANGELOG.md) ·
128
+ Issues: <https://github.com/dbtinoy-/quadkit/issues>
@@ -5,7 +5,7 @@
5
5
  # Top-level env var prefix: QK_ (nested delimiter: __)
6
6
  #
7
7
  # Core fields are declared at the top level of this file.
8
- # Extension packages (quadkit-cache, quadkit-sql, etc.) each add their own
8
+ # Extension packages (the optional provider, the optional provider, etc.) each add their own
9
9
  # top-level section (e.g. cache:, sql:, ai:) read by their own Config class.
10
10
 
11
11
  # -- Application Identity --------------------------------------------------
@@ -243,7 +243,7 @@ security:
243
243
  pbkdf2_iterations: 600000
244
244
 
245
245
  # -- Observability ---------------------------------------------------------
246
- # NEW -- Core observability hooks. Full OTLP/Prometheus config is in quadkit-monitor.
246
+ # NEW -- Core observability hooks. Full OTLP/Prometheus config is in the optional provider.
247
247
 
248
248
  observability:
249
249
  # Master switch. When false, no-op implementations are used unconditionally.
@@ -10,10 +10,7 @@
10
10
  # - Structured logging foundation
11
11
  #
12
12
  # It does NOT contain:
13
- # - Database code → quadkit-sql
14
- # - Auth/JWT/crypto → quadkit-auth
15
13
  # - HTTP/ASGI/routing → quadkit-web
16
- # - Message queue / email → quadkit-queue / quadkit-mailer / quadkit-notification
17
14
  # - Any domain-specific feature
18
15
  #
19
16
  # Core should be lightweight. `pip install quadkit` should take seconds,
@@ -30,7 +27,7 @@ build-backend = "hatchling.build"
30
27
 
31
28
  [project]
32
29
  name = "quadkit"
33
- version = "0.0.2"
30
+ version = "0.0.3"
34
31
  description = "Async-first DI/IoC framework for Python — core package"
35
32
  readme = "README.md"
36
33
  requires-python = ">=3.11"
@@ -130,7 +127,7 @@ web = [
130
127
  # events, tasks, monitor, graphql) were removed. Those packages are not
131
128
  # published, so the extras resolved against name-reservation placeholders
132
129
  # that contain no code: `pip install quadkit[cache]` succeeded and then
133
- # `import quadkit.cache` raised ModuleNotFoundError. Install extension
130
+ # `import the optional provider module` raised ModuleNotFoundError. Install extension
134
131
  # packages directly once they are published.
135
132
 
136
133
  # =============================================================================
@@ -287,3 +284,4 @@ show_missing = true
287
284
  [tool.uv.sources]
288
285
  quadkit-contracts = { workspace = true }
289
286
 
287
+
@@ -439,7 +439,9 @@ class Application(SecretsMixin, HealthProbeMixin):
439
439
  return self._apply_details_policy(
440
440
  self._probe_unavailable_result(HealthCheckCategory.STARTUP)
441
441
  )
442
- return self._apply_details_policy(await self._orchestrator.run_startup(timeout))
442
+ started = await self._orchestrator.run_startup(timeout)
443
+ started = self._baseline_component(started, HealthCheckCategory.STARTUP)
444
+ return self._apply_details_policy(started)
443
445
 
444
446
  # -- Convenience -------------------------------------------------------
445
447
 
@@ -97,6 +97,32 @@ class HealthProbeMixin:
97
97
  AggregateHealthResult(components=list(raw.values()))
98
98
  )
99
99
 
100
+ def _baseline_component(
101
+ self,
102
+ result: AggregateHealthResult,
103
+ category: HealthCheckCategory,
104
+ ) -> AggregateHealthResult:
105
+ """Ensure a running application always reports a baseline component.
106
+
107
+ Probe categories aggregate whatever checks register against them,
108
+ and an empty pool would otherwise surface as ``UNKNOWN``. The
109
+ running application itself is the truthful baseline signal: live,
110
+ started, and able to serve. Registered checks still gate the
111
+ aggregate — seeding only applies when nothing else reported.
112
+ """
113
+ if result.components:
114
+ return result
115
+ return AggregateHealthResult(
116
+ components=[
117
+ HealthCheckResult(
118
+ component=self.name,
119
+ status=HealthStatus.HEALTHY,
120
+ message="application running",
121
+ category=category,
122
+ )
123
+ ]
124
+ )
125
+
100
126
  def _probe_unavailable_result(
101
127
  self,
102
128
  category: HealthCheckCategory,
@@ -122,9 +148,9 @@ class HealthProbeMixin:
122
148
  return self._apply_details_policy(
123
149
  self._probe_unavailable_result(HealthCheckCategory.LIVENESS)
124
150
  )
125
- return self._apply_details_policy(
126
- await self._orchestrator.run_liveness(timeout)
127
- )
151
+ live = await self._orchestrator.run_liveness(timeout)
152
+ live = self._baseline_component(live, HealthCheckCategory.LIVENESS)
153
+ return self._apply_details_policy(live)
128
154
 
129
155
  async def readiness(self, timeout: float | None = None) -> AggregateHealthResult:
130
156
  """Run readiness checks for the application."""
@@ -135,9 +161,9 @@ class HealthProbeMixin:
135
161
  return self._apply_details_policy(
136
162
  self._probe_unavailable_result(HealthCheckCategory.READINESS)
137
163
  )
138
- return self._apply_details_policy(
139
- await self._orchestrator.run_readiness(timeout)
140
- )
164
+ ready = await self._orchestrator.run_readiness(timeout)
165
+ ready = self._baseline_component(ready, HealthCheckCategory.READINESS)
166
+ return self._apply_details_policy(ready)
141
167
 
142
168
 
143
169
  __all__ = ["HealthProbeMixin"]
@@ -15,7 +15,7 @@ Kernel providers (boot order governed by provider ``priority`` and ``dependencie
15
15
  For a batteries-included bundle that also provides serialization and
16
16
  concurrency, use :class:`~quadkit.app.standard.StandardModule` instead.
17
17
 
18
- Extension packages (``quadkit-cache``, ``quadkit-auth``, ``quadkit-web``,
18
+ Extension packages (``the optional provider``, ``the optional provider``, ``quadkit-web``,
19
19
  etc.) register their own providers via ``app.add_provider()`` or
20
20
  ``app.add_module()``. ``CoreModule`` intentionally imports **only** from
21
21
  ``quadkit-contracts`` and the ``quadkit`` core package — zero cross-package
@@ -329,11 +329,13 @@ def _unknown_config_keys(
329
329
  """
330
330
  import typing
331
331
 
332
- fields = getattr(model_cls, "__dataclass_fields__", {})
332
+ fields = dict(getattr(model_cls, "__dataclass_fields__", {}) or {})
333
333
  try:
334
334
  hints = typing.get_type_hints(model_cls)
335
335
  except Exception: # noqa: BLE001 — unresolvable refs degrade to flat check
336
336
  hints = {}
337
+ for hinted_name in hints:
338
+ fields.setdefault(hinted_name, None)
337
339
 
338
340
  unknown: list[str] = []
339
341
  for key, value in data.items():
@@ -4,9 +4,12 @@ from __future__ import annotations
4
4
 
5
5
  from typing import (
6
6
  TYPE_CHECKING,
7
+ Annotated,
7
8
  Any,
8
9
  TypeVar,
9
10
  cast,
11
+ get_args,
12
+ get_origin,
10
13
  overload,
11
14
  )
12
15
 
@@ -403,6 +406,17 @@ class Container(
403
406
  consumer_name = module.__name__ if module else "unknown"
404
407
  graph = _module_graph.get()
405
408
 
409
+ if get_origin(service_type) is Annotated:
410
+ annotated_args = get_args(service_type)
411
+ if annotated_args:
412
+ service_type = annotated_args[0]
413
+
414
+ providing_module = self._registry.providing_module(service_type)
415
+ if providing_module is module and module is not None:
416
+ # Private to the consuming module itself — no
417
+ # cross-module surface is involved.
418
+ return await self.__service_resolver.resolve(service_type)
419
+
406
420
  if (
407
421
  graph is not None
408
422
  and module is not None
@@ -421,27 +435,44 @@ class Container(
421
435
  exporting_names = [node.name for node in exporting_nodes]
422
436
 
423
437
  if not exporting_names:
424
- return await self.__service_resolver.resolve(service_type)
425
-
426
- exported_types = sorted(
427
- {
428
- export.__name__
429
- for node in exporting_nodes
430
- for export in getattr(node, "exports", [])
431
- }
432
- )
433
- message = format_visibility_error(
434
- consumer_module=consumer_name,
435
- consumer_provider=consumer_name,
436
- provider_module=exporting_names,
437
- service_type=service_type.__name__,
438
- exported_types=exported_types,
439
- consumer_imports=consumer_imports,
440
- )
441
- hint = (
442
- f"Import one of {exporting_names or ['the exporting module']} "
443
- f"into {consumer_name}, or make it global."
444
- )
438
+ if providing_module is None:
439
+ # Not registered through any module and not
440
+ # exported anywhere — a standalone or framework
441
+ # service, outside the module surface.
442
+ return await self.__service_resolver.resolve(service_type)
443
+ providing_name = getattr(
444
+ providing_module, "__name__", "its provider module"
445
+ )
446
+ message = (
447
+ f"Module '{consumer_name}' cannot resolve "
448
+ f"'{service_type.__name__}': provided by "
449
+ f"'{providing_name}' but not exported by it"
450
+ )
451
+ hint = (
452
+ f"Export {service_type.__name__} from "
453
+ f"'{providing_name}', or provide it from a "
454
+ "global module."
455
+ )
456
+ else:
457
+ exported_types = sorted(
458
+ {
459
+ export.__name__
460
+ for node in exporting_nodes
461
+ for export in getattr(node, "exports", [])
462
+ }
463
+ )
464
+ message = format_visibility_error(
465
+ consumer_module=consumer_name,
466
+ consumer_provider=consumer_name,
467
+ provider_module=exporting_names,
468
+ service_type=service_type.__name__,
469
+ exported_types=exported_types,
470
+ consumer_imports=consumer_imports,
471
+ )
472
+ hint = (
473
+ f"Import one of {exporting_names} "
474
+ f"into {consumer_name}, or make it global."
475
+ )
445
476
  else:
446
477
  message = (
447
478
  f"Module '{consumer_name}' cannot resolve "
@@ -2,12 +2,17 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import contextlib
5
6
  from typing import TYPE_CHECKING, TypeVar
6
7
 
7
8
  from quadkit.contracts.exceptions import ContainerError
9
+ from quadkit.di.context import get_current_module
8
10
  from quadkit.di.resolution.registry import ServiceRegistry
9
11
  from quadkit.logging import get_logger
10
12
 
13
+ if TYPE_CHECKING:
14
+ from collections.abc import Iterator
15
+
11
16
  if TYPE_CHECKING:
12
17
  from quadkit.di.types import ServiceFactory
13
18
 
@@ -40,6 +45,24 @@ class ContainerRegistrarImpl:
40
45
  """Prevent any further service registrations."""
41
46
  self._frozen = True
42
47
 
48
+ @contextlib.contextmanager
49
+ def _registration_window(self) -> Iterator[None]:
50
+ """Framework-managed window that reopens registration for the boot phase.
51
+
52
+ ``freeze()`` closes registration to user code permanently. Providers
53
+ that materialize services during boot (e.g. ``@provide`` factories)
54
+ bind their products after the container has frozen, which the
55
+ lifecycle manager performs inside this window. The window restores
56
+ the frozen state on exit — including on error — so the freeze
57
+ guarantee outside the boot phase is unchanged.
58
+ """
59
+ was_frozen = self._frozen
60
+ self._frozen = False
61
+ try:
62
+ yield
63
+ finally:
64
+ self._frozen = was_frozen
65
+
43
66
  def clear(self) -> None:
44
67
  """Clear all registered services.
45
68
 
@@ -71,6 +94,7 @@ class ContainerRegistrarImpl:
71
94
  "Cannot register transient service after container is frozen",
72
95
  )
73
96
  self._registry.transient(service_type, factory, validate=validate)
97
+ self._registry.attribute(service_type, get_current_module())
74
98
 
75
99
  def singleton(
76
100
  self,
@@ -104,6 +128,7 @@ class ContainerRegistrarImpl:
104
128
  factory=factory,
105
129
  validate=validate,
106
130
  )
131
+ self._registry.attribute(service_type, get_current_module())
107
132
 
108
133
  def scoped(
109
134
  self,
@@ -129,6 +154,7 @@ class ContainerRegistrarImpl:
129
154
  "Cannot register scoped service after container is frozen",
130
155
  )
131
156
  self._registry.scoped(service_type, factory, validate=validate, name=name)
157
+ self._registry.attribute(service_type, get_current_module())
132
158
 
133
159
  def override(self, service_type: type[T], instance: T) -> None:
134
160
  """Replace a service registration for testing purposes.
@@ -97,6 +97,13 @@ def injectable(
97
97
  ) -> Callable[[type[T]], type[T]] | type[T]:
98
98
  """Decorator to mark a class as injectable.
99
99
 
100
+ The ``scope`` metadata is honored where a descriptor is created for the
101
+ class: by ``discover_injectables()`` (module scanning) and by explicit
102
+ Provider registration. Resolving the class directly from a bare
103
+ ``Container`` without either step is not supported — the container only
104
+ auto-wires classes carrying ``@inject``-style constructor markers and
105
+ raises ``QK_ERR_DI_004`` otherwise.
106
+
100
107
  Args:
101
108
  scope_or_cls: The service scope or the class if used without parens.
102
109
  name: Optional name for the service registration.
@@ -127,7 +127,7 @@ class ProviderScanner:
127
127
  def import_string(dotted_path: str) -> Any:
128
128
  """Import a dotted module path and return the attribute at the end.
129
129
 
130
- E.g. 'quadkit.sql.DatabaseService' imports 'quadkit.sql' and returns
130
+ E.g. 'the optional provider module' imports 'the optional provider module' and returns
131
131
  the 'DatabaseService' attribute.
132
132
  """
133
133
  try: