quadkit 0.0.44__tar.gz → 0.0.46__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 (673) hide show
  1. {quadkit-0.0.44 → quadkit-0.0.46}/PKG-INFO +22 -22
  2. {quadkit-0.0.44 → quadkit-0.0.46}/README.md +17 -17
  3. {quadkit-0.0.44 → quadkit-0.0.46}/pyproject.toml +5 -5
  4. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/base.py +19 -1
  5. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/channel.py +44 -18
  6. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/collect.py +1 -1
  7. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/errors.py +4 -4
  8. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/orchestrator.py +18 -0
  9. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/resolver.py +20 -0
  10. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/base.py +134 -5
  11. quadkit-0.0.46/src/quadkit/domain/models/coercion.py +67 -0
  12. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/ambient.py +18 -0
  13. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/processors.py +53 -13
  14. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/config.py +19 -1
  15. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/core/mapper.py +97 -17
  16. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/__init__.py +58 -1
  17. quadkit-0.0.46/src/quadkit/primitives/typing.py +239 -0
  18. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/domain.py +6 -2
  19. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/coercion.py +16 -6
  20. quadkit-0.0.46/tests/unit/concurrency/test_channel_close_wakes_receivers.py +115 -0
  21. quadkit-0.0.46/tests/unit/domain/test_domain_hydration.py +388 -0
  22. quadkit-0.0.46/tests/unit/mapping/test_auto_map_dataclass.py +142 -0
  23. quadkit-0.0.46/tests/unit/primitives/test_public_surface_is_static.py +33 -0
  24. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_coercion.py +7 -4
  25. quadkit-0.0.44/src/quadkit/domain/models/coercion.py +0 -138
  26. quadkit-0.0.44/src/quadkit/primitives/typing.py +0 -123
  27. {quadkit-0.0.44 → quadkit-0.0.46}/.gitignore +0 -0
  28. {quadkit-0.0.44 → quadkit-0.0.46}/LICENSE +0 -0
  29. {quadkit-0.0.44 → quadkit-0.0.46}/NOTICE +0 -0
  30. {quadkit-0.0.44 → quadkit-0.0.46}/example.yaml +0 -0
  31. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/__init__.py +0 -0
  32. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/__init__.py +0 -0
  33. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/asgi_lifespan.py +0 -0
  34. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/__init__.py +0 -0
  35. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/discovery.py +0 -0
  36. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/models.py +0 -0
  37. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config_validation.py +0 -0
  38. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/constants.py +0 -0
  39. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/di/__init__.py +0 -0
  40. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/di/provider.py +0 -0
  41. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/discovery.py +0 -0
  42. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/events.py +0 -0
  43. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/exceptions.py +0 -0
  44. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/factory.py +0 -0
  45. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/health_probes.py +0 -0
  46. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/injectable_provider.py +0 -0
  47. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/invoker.py +0 -0
  48. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/lifecycle.py +0 -0
  49. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/module.py +0 -0
  50. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/pipeline.py +0 -0
  51. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/protocols.py +0 -0
  52. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/py.typed +0 -0
  53. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/runner.py +0 -0
  54. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/secrets.py +0 -0
  55. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/standard.py +0 -0
  56. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/types.py +0 -0
  57. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/__init__.py +0 -0
  58. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/base.py +0 -0
  59. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/field_types.py +0 -0
  60. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/__init__.py +0 -0
  61. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/__init__.py +0 -0
  62. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/py.typed +0 -0
  63. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
  64. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/__init__.py +0 -0
  65. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/py.typed +0 -0
  66. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/config.py +0 -0
  67. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/constants.py +0 -0
  68. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/__init__.py +0 -0
  69. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/provider.py +0 -0
  70. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/py.typed +0 -0
  71. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/exceptions.py +0 -0
  72. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/__init__.py +0 -0
  73. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
  74. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/parallel.py +0 -0
  75. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/py.typed +0 -0
  76. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/task_manager.py +0 -0
  77. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/__init__.py +0 -0
  78. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/py.typed +0 -0
  79. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/rwlock.py +0 -0
  80. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/module.py +0 -0
  81. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/py.typed +0 -0
  82. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/task_utils.py +0 -0
  83. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/__init__.py +0 -0
  84. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/base.py +0 -0
  85. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/constants.py +0 -0
  86. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/di/__init__.py +0 -0
  87. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/di/provider.py +0 -0
  88. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/exceptions.py +0 -0
  89. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/__init__.py +0 -0
  90. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/merge.py +0 -0
  91. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/registry.py +0 -0
  92. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/sources.py +0 -0
  93. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/validation.py +0 -0
  94. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/watcher.py +0 -0
  95. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/main.py +0 -0
  96. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/protocols.py +0 -0
  97. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/secrets.py +0 -0
  98. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/types.py +0 -0
  99. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/constants.py +0 -0
  100. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/__init__.py +0 -0
  101. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/_graph.py +0 -0
  102. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/builder.py +0 -0
  103. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/config/__init__.py +0 -0
  104. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/config/models.py +0 -0
  105. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/constants.py +0 -0
  106. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/__init__.py +0 -0
  107. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container.py +0 -0
  108. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_introspection.py +0 -0
  109. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_resolution.py +0 -0
  110. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_runtime.py +0 -0
  111. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/registrar.py +0 -0
  112. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/resolver.py +0 -0
  113. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/scope.py +0 -0
  114. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/validation.py +0 -0
  115. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/context.py +0 -0
  116. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/decorators.py +0 -0
  117. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/exceptions.py +0 -0
  118. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/__init__.py +0 -0
  119. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
  120. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/discovery.py +0 -0
  121. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/interceptors.py +0 -0
  122. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/strategies.py +0 -0
  123. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/validator.py +0 -0
  124. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/function_provider.py +0 -0
  125. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/integration/__init__.py +0 -0
  126. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/integration/provider.py +0 -0
  127. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/markers.py +0 -0
  128. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/__init__.py +0 -0
  129. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/base.py +0 -0
  130. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/__init__.py +0 -0
  131. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
  132. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/compiler.py +0 -0
  133. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/context.py +0 -0
  134. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
  135. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
  136. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
  137. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/order.py +0 -0
  138. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
  139. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
  140. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
  141. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/constants.py +0 -0
  142. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/decorator.py +0 -0
  143. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/dynamic.py +0 -0
  144. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/graph.py +0 -0
  145. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/introspection.py +0 -0
  146. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/metadata.py +0 -0
  147. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/registry.py +0 -0
  148. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/__init__.py +0 -0
  149. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/events.py +0 -0
  150. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/health.py +0 -0
  151. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/lifecycle.py +0 -0
  152. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/registry.py +0 -0
  153. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/protocols.py +0 -0
  154. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/provider.py +0 -0
  155. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/provider_utils.py +0 -0
  156. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/py.typed +0 -0
  157. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/__init__.py +0 -0
  158. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/context.py +0 -0
  159. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/descriptor.py +0 -0
  160. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/diagnostics.py +0 -0
  161. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/injector.py +0 -0
  162. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/invoker.py +0 -0
  163. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/registry.py +0 -0
  164. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/store.py +0 -0
  165. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/type_hints.py +0 -0
  166. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/validator.py +0 -0
  167. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/types.py +0 -0
  168. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/__init__.py +0 -0
  169. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/constants.py +0 -0
  170. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/exceptions.py +0 -0
  171. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/__init__.py +0 -0
  172. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/aggregate.py +0 -0
  173. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/entity.py +0 -0
  174. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/factory.py +0 -0
  175. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/py.typed +0 -0
  176. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/value_object.py +0 -0
  177. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/module.py +0 -0
  178. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/py.typed +0 -0
  179. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/types.py +0 -0
  180. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/unit_of_work.py +0 -0
  181. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/exceptions.py +0 -0
  182. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/__init__.py +0 -0
  183. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/ambient.py +0 -0
  184. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/registry.py +0 -0
  185. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/types.py +0 -0
  186. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/__init__.py +0 -0
  187. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/config.py +0 -0
  188. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/constants.py +0 -0
  189. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/di/__init__.py +0 -0
  190. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/di/provider.py +0 -0
  191. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/generator.py +0 -0
  192. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/README.md +0 -0
  193. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/__init__.py +0 -0
  194. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/__init__.py +0 -0
  195. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/models.py +0 -0
  196. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/redaction.py +0 -0
  197. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/sampling.py +0 -0
  198. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/configurator.py +0 -0
  199. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/constants.py +0 -0
  200. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/debug.py +0 -0
  201. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/di/__init__.py +0 -0
  202. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/di/provider.py +0 -0
  203. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/factory.py +0 -0
  204. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/redaction.py +0 -0
  205. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/types.py +0 -0
  206. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/__init__.py +0 -0
  207. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/constants.py +0 -0
  208. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/core/__init__.py +0 -0
  209. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/di/__init__.py +0 -0
  210. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/di/provider.py +0 -0
  211. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/exceptions.py +0 -0
  212. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/module.py +0 -0
  213. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/protocols.py +0 -0
  214. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/py.typed +0 -0
  215. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/types.py +0 -0
  216. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/__init__.py +0 -0
  217. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/__init__.py +0 -0
  218. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/caching.py +0 -0
  219. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/di.py +0 -0
  220. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/observability.py +0 -0
  221. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/resilience.py +0 -0
  222. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/routing.py +0 -0
  223. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/validation.py +0 -0
  224. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/config.py +0 -0
  225. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/constants.py +0 -0
  226. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/__init__.py +0 -0
  227. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/chain.py +0 -0
  228. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/exception_filters.py +0 -0
  229. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/registry.py +0 -0
  230. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/di/__init__.py +0 -0
  231. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/di/provider.py +0 -0
  232. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/exceptions.py +0 -0
  233. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/module.py +0 -0
  234. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/types.py +0 -0
  235. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/module.py +0 -0
  236. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/__init__.py +0 -0
  237. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/core.py +0 -0
  238. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/__init__.py +0 -0
  239. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
  240. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
  241. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/__init__.py +0 -0
  242. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/discovery.py +0 -0
  243. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/engine.py +0 -0
  244. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/exceptions.py +0 -0
  245. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/module.py +0 -0
  246. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/state.py +0 -0
  247. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/builder.py +0 -0
  248. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/clock.py +0 -0
  249. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/constants.py +0 -0
  250. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context.py +0 -0
  251. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context_keys.py +0 -0
  252. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context_registry.py +0 -0
  253. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/data.py +0 -0
  254. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/di/__init__.py +0 -0
  255. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/di/provider.py +0 -0
  256. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/exceptions.py +0 -0
  257. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/lazy.py +0 -0
  258. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/pipeline.py +0 -0
  259. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/protocols.py +0 -0
  260. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/__init__.py +0 -0
  261. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/core.py +0 -0
  262. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/introspection.py +0 -0
  263. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/trusted_html.py +0 -0
  264. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/types.py +0 -0
  265. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/py.typed +0 -0
  266. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/__init__.py +0 -0
  267. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/core.py +0 -0
  268. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/exceptions.py +0 -0
  269. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/__init__.py +0 -0
  270. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/control.py +0 -0
  271. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/time_ops.py +0 -0
  272. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/transform.py +0 -0
  273. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/retry.py +0 -0
  274. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/subjects.py +0 -0
  275. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/__init__.py +0 -0
  276. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/_pipeline.py +0 -0
  277. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/errors.py +0 -0
  278. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/types.py +0 -0
  279. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/utils.py +0 -0
  280. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/__init__.py +0 -0
  281. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/base.py +0 -0
  282. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/canonical_json.py +0 -0
  283. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/content_addressed.py +0 -0
  284. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/__init__.py +0 -0
  285. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/config.py +0 -0
  286. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/constants.py +0 -0
  287. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/decorators.py +0 -0
  288. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/encryption/__init__.py +0 -0
  289. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/encryption/service.py +0 -0
  290. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/events.py +0 -0
  291. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/exceptions.py +0 -0
  292. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/__init__.py +0 -0
  293. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/chain.py +0 -0
  294. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/decorator.py +0 -0
  295. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/__init__.py +0 -0
  296. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/ambient.py +0 -0
  297. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/digest.py +0 -0
  298. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/kdf.py +0 -0
  299. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hooks.py +0 -0
  300. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/provider.py +0 -0
  301. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/py.typed +0 -0
  302. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/__init__.py +0 -0
  303. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/filename.py +0 -0
  304. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/html.py +0 -0
  305. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/sanitizer.py +0 -0
  306. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/url.py +0 -0
  307. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/__init__.py +0 -0
  308. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/rotation.py +0 -0
  309. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/store.py +0 -0
  310. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/types.py +0 -0
  311. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/types.py +0 -0
  312. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/__init__.py +0 -0
  313. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/__init__.py +0 -0
  314. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/json.py +0 -0
  315. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/py.typed +0 -0
  316. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/config.py +0 -0
  317. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/constants.py +0 -0
  318. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/__init__.py +0 -0
  319. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/provider.py +0 -0
  320. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/py.typed +0 -0
  321. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/__init__.py +0 -0
  322. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/py.typed +0 -0
  323. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/exceptions.py +0 -0
  324. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/module.py +0 -0
  325. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/py.typed +0 -0
  326. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/__init__.py +0 -0
  327. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/py.typed +0 -0
  328. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/registry.py +0 -0
  329. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/__init__.py +0 -0
  330. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/py.typed +0 -0
  331. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/schema.py +0 -0
  332. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/types.py +0 -0
  333. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/types.py +0 -0
  334. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/__init__.py +0 -0
  335. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/config.py +0 -0
  336. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/constants.py +0 -0
  337. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/decorators.py +0 -0
  338. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/__init__.py +0 -0
  339. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/py.typed +0 -0
  340. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/validator.py +0 -0
  341. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/exceptions.py +0 -0
  342. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/module.py +0 -0
  343. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/py.typed +0 -0
  344. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/__init__.py +0 -0
  345. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/py.typed +0 -0
  346. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/rules.py +0 -0
  347. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/__init__.py +0 -0
  348. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/fields.py +0 -0
  349. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/introspection.py +0 -0
  350. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/py.typed +0 -0
  351. {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/types.py +0 -0
  352. {quadkit-0.0.44 → quadkit-0.0.46}/tests/conftest.py +0 -0
  353. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/__init__.py +0 -0
  354. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/__init__.py +0 -0
  355. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/_fixtures.py +0 -0
  356. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/conftest.py +0 -0
  357. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_boot_level.py +0 -0
  358. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_cross_method.py +0 -0
  359. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_dependency_chain.py +0 -0
  360. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_exports.py +0 -0
  361. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_importers.py +0 -0
  362. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_module_health_integration.py +0 -0
  363. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
  364. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_name_lookup.py +0 -0
  365. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
  366. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
  367. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
  368. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
  369. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_corrected_patterns_integration.py +0 -0
  370. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_database_integration.py +0 -0
  371. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_full_pipeline.py +0 -0
  372. {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_monitor_config_integration.py +0 -0
  373. {quadkit-0.0.44 → quadkit-0.0.46}/tests/test.md +0 -0
  374. {quadkit-0.0.44 → quadkit-0.0.46}/tests/test_import_diagnostic.py +0 -0
  375. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/__init__.py +0 -0
  376. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/aop/test_interceptor_timeout.py +0 -0
  377. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/clock/test_clock.py +0 -0
  378. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/__init__.py +0 -0
  379. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_generator_base.py +0 -0
  380. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_staged_generation.py +0 -0
  381. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_template_overrides.py +0 -0
  382. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/conftest.py +0 -0
  383. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_bounded_channel.py +0 -0
  384. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_channel.py +0 -0
  385. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_config.py +0 -0
  386. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
  387. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
  388. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
  389. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
  390. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
  391. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
  392. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_config_pool.py +0 -0
  393. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_dispatcher.py +0 -0
  394. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_sync_bridge.py +0 -0
  395. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_task_manager.py +0 -0
  396. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_task_utils.py +0 -0
  397. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_constants_new.py +0 -0
  398. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_protocols.py +0 -0
  399. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_sources.py +0 -0
  400. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_env_interpolation.py +0 -0
  401. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_loader_fail_fast.py +0 -0
  402. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_logging_redaction_config.py +0 -0
  403. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_logging_sampling.py +0 -0
  404. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_profile_overlay.py +0 -0
  405. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_scoping.py +0 -0
  406. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_secrets_validator.py +0 -0
  407. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_strict_bool_env.py +0 -0
  408. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_strict_sections.py +0 -0
  409. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_context_correlation.py +0 -0
  410. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_core_constants.py +0 -0
  411. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_core_types.py +0 -0
  412. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_request_context_di.py +0 -0
  413. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_typing.py +0 -0
  414. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/validation/test_protocols.py +0 -0
  415. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/__init__.py +0 -0
  416. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/integration/test_provider.py +0 -0
  417. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/__init__.py +0 -0
  418. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/conftest.py +0 -0
  419. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_compiler.py +0 -0
  420. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_decorator.py +0 -0
  421. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_dynamic.py +0 -0
  422. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_errors.py +0 -0
  423. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_global.py +0 -0
  424. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_graph_reflection.py +0 -0
  425. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_health_graph.py +0 -0
  426. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_integration.py +0 -0
  427. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_introspection.py +0 -0
  428. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_lifecycle.py +0 -0
  429. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_module_lifecycle.py +0 -0
  430. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_reexport.py +0 -0
  431. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_registry.py +0 -0
  432. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_stub_compiler.py +0 -0
  433. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_stub_decorator.py +0 -0
  434. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_visibility.py +0 -0
  435. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_advanced_features.py +0 -0
  436. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_basics.py +0 -0
  437. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_builder.py +0 -0
  438. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_freeze.py +0 -0
  439. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_hardening.py +0 -0
  440. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_visibility.py +0 -0
  441. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_decorators.py +0 -0
  442. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_descriptor.py +0 -0
  443. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_constants_new.py +0 -0
  444. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_decorators.py +0 -0
  445. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
  446. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_diagnostics.py +0 -0
  447. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_extensions_discovery.py +0 -0
  448. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_extensions_validator.py +0 -0
  449. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_function_provider_boot.py +0 -0
  450. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_graph_validator.py +0 -0
  451. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_interceptor_registry.py +0 -0
  452. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_invoker_unit.py +0 -0
  453. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
  454. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_validation.py +0 -0
  455. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_visibility_boot.py +0 -0
  456. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
  457. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_named_binding.py +0 -0
  458. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_orchestrator_health.py +0 -0
  459. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_basics.py +0 -0
  460. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_config_injection.py +0 -0
  461. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_conformance.py +0 -0
  462. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_orchestration.py +0 -0
  463. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_reset_state.py +0 -0
  464. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_utils.py +0 -0
  465. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_scope_concurrency.py +0 -0
  466. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_scope_manager.py +0 -0
  467. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_service_store.py +0 -0
  468. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_type_hints.py +0 -0
  469. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_validation.py +0 -0
  470. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/conftest.py +0 -0
  471. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_aggregates.py +0 -0
  472. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain.py +0 -0
  473. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_constants.py +0 -0
  474. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_exceptions.py +0 -0
  475. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_init.py +0 -0
  476. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_model_strict.py +0 -0
  477. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_module.py +0 -0
  478. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_models_factory.py +0 -0
  479. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_value_object.py +0 -0
  480. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/identity/test_identity.py +0 -0
  481. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/logging/test_logging_constants_new.py +0 -0
  482. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/conftest.py +0 -0
  483. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_auto_map.py +0 -0
  484. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_exceptions.py +0 -0
  485. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
  486. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
  487. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_mapper.py +0 -0
  488. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_module.py +0 -0
  489. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_types.py +0 -0
  490. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_protocol.py +0 -0
  491. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_registry.py +0 -0
  492. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/conftest.py +0 -0
  493. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_builtins.py +0 -0
  494. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_chain.py +0 -0
  495. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_config_alignment.py +0 -0
  496. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_exception_filters.py +0 -0
  497. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_chain.py +0 -0
  498. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_constants.py +0 -0
  499. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
  500. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
  501. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
  502. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_module.py +0 -0
  503. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_routing.py +0 -0
  504. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_types.py +0 -0
  505. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
  506. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_registry_defaults.py +0 -0
  507. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
  508. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_discovery.py +0 -0
  509. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_engine.py +0 -0
  510. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_state.py +0 -0
  511. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_state_hardening.py +0 -0
  512. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_validation.py +0 -0
  513. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_primitives_constants.py +0 -0
  514. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_registry_advanced.py +0 -0
  515. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_registry_introspection.py +0 -0
  516. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_trusted_html.py +0 -0
  517. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_control.py +0 -0
  518. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_core.py +0 -0
  519. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_facade.py +0 -0
  520. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_retry.py +0 -0
  521. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_subjects.py +0 -0
  522. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_time_ops.py +0 -0
  523. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_transform.py +0 -0
  524. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/__init__.py +0 -0
  525. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_exceptions.py +0 -0
  526. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_guards.py +0 -0
  527. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_hashing.py +0 -0
  528. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_package_hooks_p2.py +0 -0
  529. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secret_rotation_policy.py +0 -0
  530. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secrets_rotation.py +0 -0
  531. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secrets_store.py +0 -0
  532. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_api.py +0 -0
  533. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_components_p2.py +0 -0
  534. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_constants.py +0 -0
  535. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_exceptions.py +0 -0
  536. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_types.py +0 -0
  537. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/conftest.py +0 -0
  538. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_schema.py +0 -0
  539. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_constants.py +0 -0
  540. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
  541. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_domain.py +0 -0
  542. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_init.py +0 -0
  543. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_json.py +0 -0
  544. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_registry.py +0 -0
  545. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_types.py +0 -0
  546. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_boot_validation.py +0 -0
  547. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_config_and_misc.py +0 -0
  548. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_constants.py +0 -0
  549. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_discovery.py +0 -0
  550. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_health_baseline.py +0 -0
  551. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_health_config.py +0 -0
  552. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_runner_and_lifespan.py +0 -0
  553. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_types.py +0 -0
  554. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_validation_and_misc.py +0 -0
  555. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application.py +0 -0
  556. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application_base.py +0 -0
  557. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application_lifecycle.py +0 -0
  558. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_base_and_misc_exceptions.py +0 -0
  559. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
  560. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_codegen.py +0 -0
  561. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_compiler_graph_utils.py +0 -0
  562. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_component_exceptions.py +0 -0
  563. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_concurrency_constants.py +0 -0
  564. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_concurrency_exceptions.py +0 -0
  565. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config.py +0 -0
  566. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_constants.py +0 -0
  567. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_hardening.py +0 -0
  568. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_quadkit.py +0 -0
  569. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_requirements.py +0 -0
  570. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_sources.py +0 -0
  571. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_types.py +0 -0
  572. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_watcher.py +0 -0
  573. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_exceptions.py +0 -0
  574. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_introspection.py +0 -0
  575. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_override.py +0 -0
  576. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_resolver_impl.py +0 -0
  577. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_runtime_mixin.py +0 -0
  578. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_context_registry.py +0 -0
  579. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_contract_completeness.py +0 -0
  580. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_builder.py +0 -0
  581. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_constants.py +0 -0
  582. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_lazy.py +0 -0
  583. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_module.py +0 -0
  584. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_pipeline.py +0 -0
  585. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_dependency_injector.py +0 -0
  586. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_constants.py +0 -0
  587. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_descriptor.py +0 -0
  588. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_module_constants.py +0 -0
  589. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_constants.py +0 -0
  590. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_exceptions.py +0 -0
  591. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_model_base.py +0 -0
  592. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_dynamic_module.py +0 -0
  593. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_events_security_exceptions.py +0 -0
  594. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_execution_result.py +0 -0
  595. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hatch_build_targets.py +0 -0
  596. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_health_probes.py +0 -0
  597. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry.py +0 -0
  598. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_edge_cases.py +0 -0
  599. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_introspection.py +0 -0
  600. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_scenarios.py +0 -0
  601. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_identity_generators_and_ambient.py +0 -0
  602. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_infra_exceptions.py +0 -0
  603. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_input_sanitizers.py +0 -0
  604. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_interceptors.py +0 -0
  605. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_json_serialization_backend.py +0 -0
  606. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_apply_redaction.py +0 -0
  607. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_bridging.py +0 -0
  608. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_constants.py +0 -0
  609. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_debug.py +0 -0
  610. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_di_provider.py +0 -0
  611. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_factory.py +0 -0
  612. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_init.py +0 -0
  613. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_redaction.py +0 -0
  614. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_redaction_compound.py +0 -0
  615. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_types.py +0 -0
  616. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_m13_m14_verification.py +0 -0
  617. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapper.py +0 -0
  618. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapper_enhanced.py +0 -0
  619. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapping.py +0 -0
  620. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_enhancements.py +0 -0
  621. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_exceptions.py +0 -0
  622. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_new.py +0 -0
  623. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_decorator.py +0 -0
  624. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_scan_and_provide.py +0 -0
  625. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_system.py +0 -0
  626. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_no_db_imports.py +0 -0
  627. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_observability.py +0 -0
  628. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_orchestrator_parallel.py +0 -0
  629. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_p2_scope_log_level.py +0 -0
  630. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_context.py +0 -0
  631. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_data.py +0 -0
  632. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_registry.py +0 -0
  633. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_provider_boot_enhanced.py +0 -0
  634. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_provider_decorator.py +0 -0
  635. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_quadkit_constants.py +0 -0
  636. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_quadkit_exceptions.py +0 -0
  637. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_repr_helpers.py +0 -0
  638. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_resilience_exceptions.py +0 -0
  639. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_combinators.py +0 -0
  640. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_core.py +0 -0
  641. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_pipeline.py +0 -0
  642. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_pipeline_and_utils.py +0 -0
  643. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_types_new.py +0 -0
  644. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_utils.py +0 -0
  645. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_round22_hardening.py +0 -0
  646. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_round41_hardening.py +0 -0
  647. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_saga_primitives.py +0 -0
  648. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_sampling_and_config.py +0 -0
  649. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_secret_stores_and_rotation.py +0 -0
  650. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_serialization_constants.py +0 -0
  651. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_serialization_exceptions.py +0 -0
  652. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_service_descriptor.py +0 -0
  653. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_structured_logging.py +0 -0
  654. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_time_ops.py +0 -0
  655. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_types.py +0 -0
  656. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_exceptions.py +0 -0
  657. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_rules.py +0 -0
  658. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_validator_engine.py +0 -0
  659. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/__init__.py +0 -0
  660. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/conftest.py +0 -0
  661. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_async_validator.py +0 -0
  662. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_coercion.py +0 -0
  663. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_helpers.py +0 -0
  664. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation.py +0 -0
  665. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_constants.py +0 -0
  666. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_constants_new.py +0 -0
  667. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_fields.py +0 -0
  668. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_fields_extended.py +0 -0
  669. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_init.py +0 -0
  670. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_introspection.py +0 -0
  671. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_module.py +0 -0
  672. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_types.py +0 -0
  673. {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validator.py +0 -0
@@ -1,14 +1,14 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit
3
- Version: 0.0.44
3
+ Version: 0.0.46
4
4
  Summary: Async-first DI/IoC framework for Python — core package
5
- Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
5
+ Project-URL: Homepage, https://oridecon.dev
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
7
- Project-URL: Documentation, https://dbtinoy-.github.io/quadkit/
7
+ Project-URL: Documentation, https://oridecon.dev/quadkit/
8
8
  Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
9
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>
10
+ Author-email: Quadkit Framework Team <hello@oridecon.dev>
11
+ Maintainer-email: Quadkit Framework Team <hello@oridecon.dev>
12
12
  License: Apache-2.0
13
13
  License-File: LICENSE
14
14
  License-File: NOTICE
@@ -140,7 +140,7 @@ asyncio.run(main())
140
140
  ```
141
141
 
142
142
  For the web quickstart (a real endpoint in minutes), see
143
- [the docs](https://dbtinoy-.github.io/quadkit/getting-started/first-app/).
143
+ [the docs](https://oridecon.dev/quadkit/getting-started/first-app/).
144
144
 
145
145
  ## Expected failures are values
146
146
 
@@ -172,7 +172,7 @@ result = (
172
172
 
173
173
  In controllers, returning an `Err` renders as an RFC 7807 problem
174
174
  response automatically — see the
175
- [error-handling guide](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
175
+ [error-handling guide](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
176
176
 
177
177
  ## Optional extras
178
178
 
@@ -203,11 +203,11 @@ Providers can also define an async `boot()` (acquire resources) and
203
203
  `shutdown()` (release them, in reverse registration order) — the
204
204
  container drives the whole lifecycle.
205
205
 
206
- Concepts: [contracts](https://dbtinoy-.github.io/quadkit/concepts/contracts/) ·
207
- [dependency injection](https://dbtinoy-.github.io/quadkit/concepts/dependency-injection/) ·
208
- [modules](https://dbtinoy-.github.io/quadkit/concepts/modules/) ·
209
- [lifecycle](https://dbtinoy-.github.io/quadkit/concepts/lifecycle/) ·
210
- [async model](https://dbtinoy-.github.io/quadkit/concepts/async-model/).
206
+ Concepts: [contracts](https://oridecon.dev/quadkit/fundamentals/container-protocols/) ·
207
+ [dependency injection](https://oridecon.dev/quadkit/fundamentals/dependency-injection/) ·
208
+ [modules](https://oridecon.dev/quadkit/fundamentals/modules/) ·
209
+ [lifecycle](https://oridecon.dev/quadkit/fundamentals/application-lifecycle/) ·
210
+ [async model](https://oridecon.dev/quadkit/fundamentals/architecture/).
211
211
 
212
212
  ## Configuration
213
213
 
@@ -223,7 +223,7 @@ QK_PROFILE=production # select a profile block
223
223
  ```
224
224
 
225
225
  See
226
- [configuration](https://dbtinoy-.github.io/quadkit/getting-started/configuration/).
226
+ [configuration](https://oridecon.dev/quadkit/getting-started/configuration/).
227
227
 
228
228
  ## Error handling
229
229
 
@@ -231,36 +231,36 @@ See
231
231
  `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
232
232
  NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
233
233
  else. The web layer renders both as problem responses — see
234
- [error handling](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
234
+ [error handling](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
235
235
 
236
236
  ## Testing
237
237
 
238
238
  Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
239
239
  your application in-process (with `overrides={Contract: fake}` for test
240
240
  doubles), no server required. See
241
- [testing](https://dbtinoy-.github.io/quadkit/getting-started/testing/).
241
+ [testing](https://oridecon.dev/quadkit/guides/testing/).
242
242
 
243
243
  ## Security
244
244
 
245
245
  Never put secrets in `application.yaml` — pass them through `QK_*`
246
246
  environment variables or a secret store. Unexpected exceptions never
247
247
  leak internals to clients. See
248
- [secure configuration](https://dbtinoy-.github.io/quadkit/security/secure-configuration/) and
248
+ [secure configuration](https://oridecon.dev/quadkit/getting-started/configuration/) and
249
249
  report vulnerabilities privately per
250
250
  [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
251
251
 
252
252
  ## Stability
253
253
 
254
- Version `0.0.44` in the `0.x` series, released in lockstep with the
255
- other four distributions; APIs may change between minor versions until
254
+ Version `0.0.46` in the `0.x` series, released in lockstep with the
255
+ other twelve distributions; APIs may change between minor versions until
256
256
  1.0 — pin an exact version
257
- (`quadkit==0.0.44`) or a tight range (`>=0.0.44,<0.1.0`). Full policy:
258
- [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
257
+ (`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
258
+ [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
259
259
 
260
260
  ## Links
261
261
 
262
- - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
263
- - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
262
+ - **Documentation** — <https://oridecon.dev/quadkit/>
263
+ - **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
264
264
  - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
265
265
  - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
266
266
  - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
@@ -88,7 +88,7 @@ asyncio.run(main())
88
88
  ```
89
89
 
90
90
  For the web quickstart (a real endpoint in minutes), see
91
- [the docs](https://dbtinoy-.github.io/quadkit/getting-started/first-app/).
91
+ [the docs](https://oridecon.dev/quadkit/getting-started/first-app/).
92
92
 
93
93
  ## Expected failures are values
94
94
 
@@ -120,7 +120,7 @@ result = (
120
120
 
121
121
  In controllers, returning an `Err` renders as an RFC 7807 problem
122
122
  response automatically — see the
123
- [error-handling guide](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
123
+ [error-handling guide](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
124
124
 
125
125
  ## Optional extras
126
126
 
@@ -151,11 +151,11 @@ Providers can also define an async `boot()` (acquire resources) and
151
151
  `shutdown()` (release them, in reverse registration order) — the
152
152
  container drives the whole lifecycle.
153
153
 
154
- Concepts: [contracts](https://dbtinoy-.github.io/quadkit/concepts/contracts/) ·
155
- [dependency injection](https://dbtinoy-.github.io/quadkit/concepts/dependency-injection/) ·
156
- [modules](https://dbtinoy-.github.io/quadkit/concepts/modules/) ·
157
- [lifecycle](https://dbtinoy-.github.io/quadkit/concepts/lifecycle/) ·
158
- [async model](https://dbtinoy-.github.io/quadkit/concepts/async-model/).
154
+ Concepts: [contracts](https://oridecon.dev/quadkit/fundamentals/container-protocols/) ·
155
+ [dependency injection](https://oridecon.dev/quadkit/fundamentals/dependency-injection/) ·
156
+ [modules](https://oridecon.dev/quadkit/fundamentals/modules/) ·
157
+ [lifecycle](https://oridecon.dev/quadkit/fundamentals/application-lifecycle/) ·
158
+ [async model](https://oridecon.dev/quadkit/fundamentals/architecture/).
159
159
 
160
160
  ## Configuration
161
161
 
@@ -171,7 +171,7 @@ QK_PROFILE=production # select a profile block
171
171
  ```
172
172
 
173
173
  See
174
- [configuration](https://dbtinoy-.github.io/quadkit/getting-started/configuration/).
174
+ [configuration](https://oridecon.dev/quadkit/getting-started/configuration/).
175
175
 
176
176
  ## Error handling
177
177
 
@@ -179,36 +179,36 @@ See
179
179
  `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
180
180
  NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
181
181
  else. The web layer renders both as problem responses — see
182
- [error handling](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
182
+ [error handling](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
183
183
 
184
184
  ## Testing
185
185
 
186
186
  Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
187
187
  your application in-process (with `overrides={Contract: fake}` for test
188
188
  doubles), no server required. See
189
- [testing](https://dbtinoy-.github.io/quadkit/getting-started/testing/).
189
+ [testing](https://oridecon.dev/quadkit/guides/testing/).
190
190
 
191
191
  ## Security
192
192
 
193
193
  Never put secrets in `application.yaml` — pass them through `QK_*`
194
194
  environment variables or a secret store. Unexpected exceptions never
195
195
  leak internals to clients. See
196
- [secure configuration](https://dbtinoy-.github.io/quadkit/security/secure-configuration/) and
196
+ [secure configuration](https://oridecon.dev/quadkit/getting-started/configuration/) and
197
197
  report vulnerabilities privately per
198
198
  [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
199
199
 
200
200
  ## Stability
201
201
 
202
- Version `0.0.44` in the `0.x` series, released in lockstep with the
203
- other four distributions; APIs may change between minor versions until
202
+ Version `0.0.46` in the `0.x` series, released in lockstep with the
203
+ other twelve distributions; APIs may change between minor versions until
204
204
  1.0 — pin an exact version
205
- (`quadkit==0.0.44`) or a tight range (`>=0.0.44,<0.1.0`). Full policy:
206
- [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
205
+ (`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
206
+ [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
207
207
 
208
208
  ## Links
209
209
 
210
- - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
211
- - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
210
+ - **Documentation** — <https://oridecon.dev/quadkit/>
211
+ - **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
212
212
  - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
213
213
  - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
214
214
  - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
@@ -29,7 +29,7 @@ build-backend = "hatchling.build"
29
29
 
30
30
  [project]
31
31
  name = "quadkit"
32
- version = "0.0.44"
32
+ version = "0.0.46"
33
33
  description = "Async-first DI/IoC framework for Python — core package"
34
34
  readme = "README.md"
35
35
  requires-python = ">=3.11"
@@ -55,10 +55,10 @@ classifiers = [
55
55
  "Typing :: Typed",
56
56
  ]
57
57
  authors = [
58
- { name = "Quadkit Framework Team", email = "team@quadkit.dev" },
58
+ { name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
59
59
  ]
60
60
  maintainers = [
61
- { name = "Quadkit Framework Team", email = "team@quadkit.dev" },
61
+ { name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
62
62
  ]
63
63
 
64
64
  # =============================================================================
@@ -138,9 +138,9 @@ web = [
138
138
  # =============================================================================
139
139
 
140
140
  [project.urls]
141
- Homepage = "https://dbtinoy-.github.io/quadkit/"
141
+ Homepage = "https://oridecon.dev"
142
142
  Repository = "https://github.com/dbtinoy-/quadkit"
143
- Documentation = "https://dbtinoy-.github.io/quadkit/"
143
+ Documentation = "https://oridecon.dev/quadkit/"
144
144
  Issues = "https://github.com/dbtinoy-/quadkit/issues"
145
145
  Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
146
146
 
@@ -29,6 +29,7 @@ if TYPE_CHECKING:
29
29
  from collections.abc import AsyncIterator
30
30
 
31
31
  from quadkit.di.module.dynamic import DynamicModule
32
+ from quadkit.di.module.graph import CompiledModuleGraph
32
33
  from quadkit.di.provider import Provider
33
34
  from quadkit.logging import LoggerProtocol
34
35
 
@@ -73,7 +74,7 @@ class Application(SecretsMixin, HealthProbeMixin):
73
74
  self._state = AppState.CREATED
74
75
  self._container = Container()
75
76
  self._container.singleton(type(self), self)
76
- self._orchestrator = ProviderOrchestrator(self._container)
77
+ self._orchestrator: ProviderOrchestrator = ProviderOrchestrator(self._container)
77
78
 
78
79
  self._config = config or QuadkitConfig.from_env_profile()
79
80
  self._container.singleton(QuadkitConfig, self._config)
@@ -136,6 +137,23 @@ class Application(SecretsMixin, HealthProbeMixin):
136
137
  """DI container."""
137
138
  return self._container
138
139
 
140
+ @property
141
+ def module_graph(self) -> CompiledModuleGraph | None:
142
+ """The compiled module graph, or ``None`` before compilation.
143
+
144
+ Read-only view of what the boot sequence compiled: every module with
145
+ its providers, imports, and fully expanded exports. It exists so
146
+ boot-time guards can assert that what a module *declares* it exports is
147
+ what the container can actually resolve — the failure this graph is
148
+ otherwise blind to, because an export that nothing resolves during
149
+ boot only fails later, at ``QK_ERR_DI_004`` on first use, or never.
150
+
151
+ Returns:
152
+ The compiled graph, or ``None`` when the application has not been
153
+ compiled yet.
154
+ """
155
+ return self._orchestrator.compiled_graph
156
+
139
157
  @property
140
158
  def providers(self) -> list[Provider]:
141
159
  """Get all registered providers."""
@@ -65,6 +65,12 @@ class BoundedChannel(Generic[T]):
65
65
  )
66
66
  self._closed = False
67
67
  self._lock = asyncio.Lock()
68
+ #: Set whenever something a waiting receiver cares about happened:
69
+ #: an item arrived or the channel closed. Receivers clear it before
70
+ #: they wait. They never dequeue from a helper task, so an item is
71
+ #: either in the queue or in the consumer's hands — there is no tick
72
+ #: in between where ``is_empty`` lies.
73
+ self._wakeup = asyncio.Event()
68
74
 
69
75
  async def send(self, item: T) -> None:
70
76
  """Send an item, blocking if the channel is full.
@@ -91,6 +97,7 @@ class BoundedChannel(Generic[T]):
91
97
  # full, but that means the item was never actually enqueued.
92
98
  with suppress(asyncio.QueueFull):
93
99
  self._queue.put_nowait(wrapped)
100
+ self._wakeup.set()
94
101
  raise
95
102
  except asyncio.QueueFull:
96
103
  msg = "Channel is full"
@@ -98,6 +105,7 @@ class BoundedChannel(Generic[T]):
98
105
  msg,
99
106
  capacity=self.capacity,
100
107
  ) from None
108
+ self._wakeup.set()
101
109
 
102
110
  def send_nowait(self, item: T) -> None:
103
111
  """Send an item without blocking.
@@ -128,6 +136,7 @@ class BoundedChannel(Generic[T]):
128
136
  except asyncio.QueueFull:
129
137
  msg = "Channel is full"
130
138
  raise ChannelFullError(msg, capacity=self.capacity) from None
139
+ self._wakeup.set()
131
140
 
132
141
  async def receive(self) -> T:
133
142
  """Receive an item, blocking if the channel is empty.
@@ -138,29 +147,40 @@ class BoundedChannel(Generic[T]):
138
147
  Raises:
139
148
  ChannelClosedError: If the channel is closed and empty.
140
149
  """
141
- try:
142
- wrapped: _ContextualItem[T] = await self._queue.get()
143
- except asyncio.CancelledError:
144
- # If cancelled after the queue internally dequeued an item,
145
- # put it back so it is not lost. get_nowait will raise
146
- # QueueEmpty if nothing was actually dequeued yet.
147
- try:
148
- item_back = self._queue.get_nowait()
149
- self._queue.put_nowait(item_back)
150
- except asyncio.QueueEmpty:
151
- pass
152
- raise
153
- except asyncio.QueueEmpty:
154
- if self._closed:
155
- msg = "Channel is closed"
156
- raise ChannelClosedError(msg) from None
157
- raise
150
+ wrapped = await self._next_item()
158
151
  # Restore sender's context variables so OTel trace spans and other
159
152
  # context state are propagated to the consumer.
160
153
  for var, value in wrapped.ctx.items():
161
154
  var.set(value)
162
155
  return wrapped.item
163
156
 
157
+ async def _next_item(self) -> _ContextualItem[T]:
158
+ """Dequeue the next wrapped item, or raise once closed and drained.
159
+
160
+ The hot path — an item is already queued — is a plain
161
+ ``get_nowait``. Only an empty channel waits, and it waits on one
162
+ wake-up that both :meth:`send` and :meth:`close` raise. Without the
163
+ close half, ``close()`` could not end an ``async for`` over an empty
164
+ channel, and every consumer loop would outlive the thing it consumed.
165
+
166
+ The dequeue itself is always synchronous in the consumer's own task.
167
+ Pulling the item inside a helper task would open a window where the
168
+ queue is already empty but the consumer has not resumed yet — a
169
+ caller polling ``is_empty`` (the event bus's ``flush``) would
170
+ conclude the work was done one tick before it started.
171
+ """
172
+ while True:
173
+ try:
174
+ return self._queue.get_nowait()
175
+ except asyncio.QueueEmpty:
176
+ if self._closed:
177
+ msg = "Channel is closed"
178
+ raise ChannelClosedError(msg) from None
179
+ # Nothing queued and not closed: both facts were read without an
180
+ # intervening await, so clearing here cannot swallow a wake-up.
181
+ self._wakeup.clear()
182
+ await self._wakeup.wait()
183
+
164
184
  def receive_nowait(self) -> T:
165
185
  """Receive an item without blocking.
166
186
 
@@ -183,9 +203,15 @@ class BoundedChannel(Generic[T]):
183
203
  return wrapped.item
184
204
 
185
205
  async def close(self) -> None:
186
- """Close the channel. Remaining items can still be received."""
206
+ """Close the channel. Remaining items can still be received.
207
+
208
+ Receivers blocked on an empty channel are woken and get
209
+ :class:`ChannelClosedError` (``StopAsyncIteration`` under
210
+ ``async for``), so a consumer loop ends when its producer does.
211
+ """
187
212
  async with self._lock:
188
213
  self._closed = True
214
+ self._wakeup.set()
189
215
 
190
216
  @property
191
217
  def is_closed(self) -> bool:
@@ -95,7 +95,7 @@ class CollectPhase:
95
95
  raise ModuleError(
96
96
  f"'{cls.__name__}' is not decorated with @module.\n"
97
97
  f"\n"
98
- f"Reference: {DOCS_BASE_URL}/modules#declaration",
98
+ f"Reference: {DOCS_BASE_URL}/fundamentals/modules/",
99
99
  hint=(
100
100
  f"Add @module() to {cls.__name__}, or import "
101
101
  f"{cls.__name__}.configure() instead."
@@ -47,7 +47,7 @@ def format_cycle_error(cycle: list[str]) -> str:
47
47
  f" 1. Extract shared types into a separate module\n"
48
48
  f" 2. Remove the circular import from one side\n"
49
49
  f"\n"
50
- f"Reference: {DOCS_BASE_URL}/modules#cycles"
50
+ f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
51
51
  )
52
52
 
53
53
 
@@ -88,7 +88,7 @@ def format_missing_import_error(
88
88
  f" 1. Add {missing_name} to your create_app() via app.add_module()\n"
89
89
  f" 2. Or remove {missing_name} from {module_name}.imports\n"
90
90
  f"\n"
91
- f"Reference: {DOCS_BASE_URL}/modules#imports"
91
+ f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
92
92
  )
93
93
 
94
94
 
@@ -192,7 +192,7 @@ def format_visibility_error(
192
192
  f" 2. Make the exporting module global with @module(is_global=True)\n"
193
193
  f" 3. Depend on a service that is already exported\n"
194
194
  f"\n"
195
- f" Reference: {DOCS_BASE_URL}/modules#visibility"
195
+ f" Reference: {DOCS_BASE_URL}/fundamentals/modules/"
196
196
  )
197
197
 
198
198
 
@@ -232,7 +232,7 @@ def format_duplicate_module_error(
232
232
  f" 1. Remove one of the add_module() calls\n"
233
233
  f" 2. Or merge the configurations into a single configure() call\n"
234
234
  f"\n"
235
- f"Reference: {DOCS_BASE_URL}/modules#configuration"
235
+ f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
236
236
  )
237
237
 
238
238
 
@@ -110,6 +110,24 @@ class ProviderOrchestrator:
110
110
  """
111
111
  self._registry._compiled_graph = graph
112
112
 
113
+ @property
114
+ def compiled_graph(self) -> CompiledModuleGraph | None:
115
+ """The compiled module graph, or ``None`` before compilation.
116
+
117
+ The public companion to :meth:`set_compiled_graph`. The graph is what
118
+ knows which module declares which export, and the code that needs to
119
+ answer that question lives outside this class: health probes, boot-time
120
+ assertions, and test guards. Without a reader the only way to ask was
121
+ the private ``_compiled_graph``, so every such caller reached into the
122
+ orchestrator's internals — and a rename would have broken them without
123
+ a test to notice.
124
+
125
+ Returns:
126
+ The graph produced by :class:`ModuleCompiler`, or ``None`` when the
127
+ application has not been compiled yet.
128
+ """
129
+ return self._registry._compiled_graph
130
+
113
131
  def add(self, provider: Provider) -> None:
114
132
  """Add a provider to be orchestrated.
115
133
 
@@ -187,6 +187,26 @@ class ServiceResolver:
187
187
 
188
188
  return instance
189
189
 
190
+ async def resolve_optional(self, service_type: Any) -> Any | None:
191
+ """Resolve a service, returning ``None`` when it is not registered.
192
+
193
+ ``ContainerResolverProtocol`` has declared this method all along, and
194
+ the container implements it, but the resolver handed to provider
195
+ factories did not: a provider asking for an optional dependency had to
196
+ pair ``has()`` with ``resolve()`` and hope nothing moved in between.
197
+ Absent means absent — a registered service whose construction raises
198
+ still raises.
199
+
200
+ Args:
201
+ service_type: The type to resolve.
202
+
203
+ Returns:
204
+ The resolved instance, or ``None`` when nothing is registered for it.
205
+ """
206
+ if not self.can_resolve(service_type):
207
+ return None
208
+ return await self.resolve(service_type)
209
+
190
210
  async def _create_instance(self, descriptor: ServiceDescriptor) -> Any:
191
211
  """Create a service instance from its descriptor."""
192
212
  impl = descriptor.implementation