quadkit 0.0.46__tar.gz → 0.0.50__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 (691) hide show
  1. {quadkit-0.0.46 → quadkit-0.0.50}/PKG-INFO +8 -6
  2. {quadkit-0.0.46 → quadkit-0.0.50}/README.md +3 -3
  3. {quadkit-0.0.46 → quadkit-0.0.50}/pyproject.toml +8 -3
  4. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/__init__.py +3 -0
  5. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/base.py +8 -5
  6. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/discovery.py +18 -12
  7. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/lifecycle.py +4 -2
  8. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/module.py +5 -1
  9. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/standard.py +5 -1
  10. quadkit-0.0.50/src/quadkit/codegen/__init__.py +30 -0
  11. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/codegen/base.py +12 -0
  12. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/executors/task_manager.py +3 -10
  13. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/task_utils.py +2 -3
  14. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/base.py +14 -6
  15. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/di/provider.py +50 -30
  16. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/sources.py +35 -37
  17. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/container_resolution.py +12 -2
  18. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/scope.py +67 -25
  19. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/lifecycle.py +7 -2
  20. quadkit-0.0.50/src/quadkit/di/resolution/context.py +125 -0
  21. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/base.py +161 -29
  22. quadkit-0.0.50/src/quadkit/domain/models/coercion.py +121 -0
  23. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/__init__.py +4 -0
  24. quadkit-0.0.50/src/quadkit/logging/safe.py +16 -0
  25. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/discovery.py +10 -0
  26. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/exceptions.py +4 -3
  27. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/state.py +4 -10
  28. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/clock.py +7 -2
  29. quadkit-0.0.50/src/quadkit/primitives/namespace.py +32 -0
  30. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/pipeline.py +1 -1
  31. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/__init__.py +4 -0
  32. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/guards/chain.py +6 -9
  33. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/provider.py +93 -1
  34. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/sanitization/html.py +4 -2
  35. quadkit-0.0.50/src/quadkit/security/signing.py +97 -0
  36. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/domain/domain.py +108 -11
  37. quadkit-0.0.50/src/quadkit/serialization/schema/schema.py +135 -0
  38. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/__init__.py +6 -0
  39. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/engine/coercion.py +103 -6
  40. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/schema/__init__.py +4 -0
  41. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/schema/fields.py +17 -0
  42. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_task_manager.py +38 -0
  43. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_task_utils.py +7 -4
  44. quadkit-0.0.50/tests/unit/config/test_config_provider_log_privacy.py +37 -0
  45. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_config_sources.py +55 -4
  46. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_loader_fail_fast.py +8 -3
  47. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_strict_sections.py +2 -1
  48. quadkit-0.0.50/tests/unit/di/test_request_resolver_context.py +77 -0
  49. quadkit-0.0.50/tests/unit/di/test_resolve_all_visibility.py +62 -0
  50. quadkit-0.0.50/tests/unit/di/test_scope_constructor_resolution.py +144 -0
  51. quadkit-0.0.50/tests/unit/domain/test_computed_field_roundtrip.py +64 -0
  52. quadkit-0.0.50/tests/unit/domain/test_domain_model_dto_parity.py +146 -0
  53. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/plugins/test_state_hardening.py +34 -4
  54. quadkit-0.0.50/tests/unit/primitives/test_namespace.py +48 -0
  55. quadkit-0.0.50/tests/unit/security/test_env_secrets_provider.py +70 -0
  56. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_guards.py +46 -0
  57. quadkit-0.0.50/tests/unit/security/test_signing.py +41 -0
  58. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_discovery.py +19 -7
  59. quadkit-0.0.50/tests/unit/test_application_invalid_graph_cleanup.py +56 -0
  60. quadkit-0.0.50/tests/unit/test_application_module_iterables.py +42 -0
  61. quadkit-0.0.50/tests/unit/test_clock_today.py +62 -0
  62. quadkit-0.0.50/tests/unit/test_config_fallback_path.py +122 -0
  63. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_domain_model_base.py +11 -1
  64. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_init.py +12 -0
  65. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_coercion.py +36 -6
  66. quadkit-0.0.46/src/quadkit/codegen/__init__.py +0 -13
  67. quadkit-0.0.46/src/quadkit/di/resolution/context.py +0 -59
  68. quadkit-0.0.46/src/quadkit/domain/models/coercion.py +0 -67
  69. quadkit-0.0.46/src/quadkit/serialization/schema/schema.py +0 -84
  70. {quadkit-0.0.46 → quadkit-0.0.50}/.gitignore +0 -0
  71. {quadkit-0.0.46 → quadkit-0.0.50}/LICENSE +0 -0
  72. {quadkit-0.0.46 → quadkit-0.0.50}/NOTICE +0 -0
  73. {quadkit-0.0.46 → quadkit-0.0.50}/example.yaml +0 -0
  74. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/__init__.py +0 -0
  75. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/asgi_lifespan.py +0 -0
  76. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/config/__init__.py +0 -0
  77. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/config/discovery.py +0 -0
  78. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/config/models.py +0 -0
  79. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/config_validation.py +0 -0
  80. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/constants.py +0 -0
  81. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/di/__init__.py +0 -0
  82. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/di/provider.py +0 -0
  83. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/events.py +0 -0
  84. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/exceptions.py +0 -0
  85. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/factory.py +0 -0
  86. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/health_probes.py +0 -0
  87. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/injectable_provider.py +0 -0
  88. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/invoker.py +0 -0
  89. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/pipeline.py +0 -0
  90. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/protocols.py +0 -0
  91. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/py.typed +0 -0
  92. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/runner.py +0 -0
  93. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/secrets.py +0 -0
  94. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/app/types.py +0 -0
  95. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/codegen/field_types.py +0 -0
  96. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/__init__.py +0 -0
  97. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/bridges/__init__.py +0 -0
  98. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/bridges/py.typed +0 -0
  99. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
  100. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/channels/__init__.py +0 -0
  101. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/channels/channel.py +0 -0
  102. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/channels/py.typed +0 -0
  103. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/config.py +0 -0
  104. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/constants.py +0 -0
  105. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/di/__init__.py +0 -0
  106. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/di/provider.py +0 -0
  107. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/di/py.typed +0 -0
  108. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/exceptions.py +0 -0
  109. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/executors/__init__.py +0 -0
  110. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
  111. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/executors/parallel.py +0 -0
  112. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/executors/py.typed +0 -0
  113. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/locks/__init__.py +0 -0
  114. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/locks/py.typed +0 -0
  115. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/locks/rwlock.py +0 -0
  116. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/module.py +0 -0
  117. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/concurrency/py.typed +0 -0
  118. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/__init__.py +0 -0
  119. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/constants.py +0 -0
  120. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/di/__init__.py +0 -0
  121. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/exceptions.py +0 -0
  122. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/__init__.py +0 -0
  123. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/merge.py +0 -0
  124. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/registry.py +0 -0
  125. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/validation.py +0 -0
  126. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/lib/watcher.py +0 -0
  127. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/main.py +0 -0
  128. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/protocols.py +0 -0
  129. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/secrets.py +0 -0
  130. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/config/types.py +0 -0
  131. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/constants.py +0 -0
  132. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/__init__.py +0 -0
  133. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/_graph.py +0 -0
  134. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/builder.py +0 -0
  135. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/config/__init__.py +0 -0
  136. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/config/models.py +0 -0
  137. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/constants.py +0 -0
  138. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/__init__.py +0 -0
  139. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/container.py +0 -0
  140. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/container_introspection.py +0 -0
  141. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/container_runtime.py +0 -0
  142. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/registrar.py +0 -0
  143. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/resolver.py +0 -0
  144. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/container/validation.py +0 -0
  145. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/context.py +0 -0
  146. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/decorators.py +0 -0
  147. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/exceptions.py +0 -0
  148. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/__init__.py +0 -0
  149. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
  150. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/discovery.py +0 -0
  151. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/interceptors.py +0 -0
  152. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/strategies.py +0 -0
  153. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/extensions/validator.py +0 -0
  154. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/function_provider.py +0 -0
  155. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/integration/__init__.py +0 -0
  156. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/integration/provider.py +0 -0
  157. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/markers.py +0 -0
  158. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/__init__.py +0 -0
  159. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/base.py +0 -0
  160. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/__init__.py +0 -0
  161. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
  162. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/compiler.py +0 -0
  163. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/context.py +0 -0
  164. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
  165. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/collect.py +0 -0
  166. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
  167. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
  168. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/order.py +0 -0
  169. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
  170. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
  171. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
  172. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/constants.py +0 -0
  173. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/decorator.py +0 -0
  174. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/dynamic.py +0 -0
  175. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/errors.py +0 -0
  176. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/graph.py +0 -0
  177. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/introspection.py +0 -0
  178. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/metadata.py +0 -0
  179. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/module/registry.py +0 -0
  180. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/__init__.py +0 -0
  181. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/events.py +0 -0
  182. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/health.py +0 -0
  183. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
  184. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/orchestrator/registry.py +0 -0
  185. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/protocols.py +0 -0
  186. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/provider.py +0 -0
  187. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/provider_utils.py +0 -0
  188. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/py.typed +0 -0
  189. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/__init__.py +0 -0
  190. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/descriptor.py +0 -0
  191. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/diagnostics.py +0 -0
  192. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/injector.py +0 -0
  193. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/invoker.py +0 -0
  194. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/registry.py +0 -0
  195. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/resolver.py +0 -0
  196. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/store.py +0 -0
  197. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/type_hints.py +0 -0
  198. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/resolution/validator.py +0 -0
  199. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/di/types.py +0 -0
  200. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/__init__.py +0 -0
  201. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/constants.py +0 -0
  202. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/exceptions.py +0 -0
  203. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/__init__.py +0 -0
  204. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/aggregate.py +0 -0
  205. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/entity.py +0 -0
  206. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/factory.py +0 -0
  207. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/py.typed +0 -0
  208. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/models/value_object.py +0 -0
  209. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/module.py +0 -0
  210. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/py.typed +0 -0
  211. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/types.py +0 -0
  212. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/domain/unit_of_work.py +0 -0
  213. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/exceptions.py +0 -0
  214. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/hooks/__init__.py +0 -0
  215. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/hooks/ambient.py +0 -0
  216. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/hooks/registry.py +0 -0
  217. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/hooks/types.py +0 -0
  218. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/__init__.py +0 -0
  219. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/ambient.py +0 -0
  220. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/config.py +0 -0
  221. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/constants.py +0 -0
  222. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/di/__init__.py +0 -0
  223. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/di/provider.py +0 -0
  224. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/identity/generator.py +0 -0
  225. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/README.md +0 -0
  226. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/config/__init__.py +0 -0
  227. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/config/models.py +0 -0
  228. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/config/redaction.py +0 -0
  229. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/config/sampling.py +0 -0
  230. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/configurator.py +0 -0
  231. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/constants.py +0 -0
  232. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/debug.py +0 -0
  233. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/di/__init__.py +0 -0
  234. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/di/provider.py +0 -0
  235. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/factory.py +0 -0
  236. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/processors.py +0 -0
  237. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/redaction.py +0 -0
  238. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/logging/types.py +0 -0
  239. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/__init__.py +0 -0
  240. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/config.py +0 -0
  241. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/constants.py +0 -0
  242. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/core/__init__.py +0 -0
  243. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/core/mapper.py +0 -0
  244. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/di/__init__.py +0 -0
  245. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/di/provider.py +0 -0
  246. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/exceptions.py +0 -0
  247. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/module.py +0 -0
  248. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/protocols.py +0 -0
  249. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/py.typed +0 -0
  250. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/mapping/types.py +0 -0
  251. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/__init__.py +0 -0
  252. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/__init__.py +0 -0
  253. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/caching.py +0 -0
  254. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/di.py +0 -0
  255. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/observability.py +0 -0
  256. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/resilience.py +0 -0
  257. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/routing.py +0 -0
  258. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/builtins/validation.py +0 -0
  259. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/config.py +0 -0
  260. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/constants.py +0 -0
  261. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/core/__init__.py +0 -0
  262. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/core/chain.py +0 -0
  263. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/core/exception_filters.py +0 -0
  264. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/core/registry.py +0 -0
  265. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/di/__init__.py +0 -0
  266. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/di/provider.py +0 -0
  267. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/exceptions.py +0 -0
  268. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/module.py +0 -0
  269. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/middleware/types.py +0 -0
  270. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/module.py +0 -0
  271. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/observability/__init__.py +0 -0
  272. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/observability/core.py +0 -0
  273. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/observability/di/__init__.py +0 -0
  274. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
  275. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
  276. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/__init__.py +0 -0
  277. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/engine.py +0 -0
  278. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/plugins/module.py +0 -0
  279. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/__init__.py +0 -0
  280. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/builder.py +0 -0
  281. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/constants.py +0 -0
  282. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/context.py +0 -0
  283. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/context_keys.py +0 -0
  284. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/context_registry.py +0 -0
  285. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/data.py +0 -0
  286. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/di/__init__.py +0 -0
  287. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/di/provider.py +0 -0
  288. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/exceptions.py +0 -0
  289. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/lazy.py +0 -0
  290. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/protocols.py +0 -0
  291. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/registry/__init__.py +0 -0
  292. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/registry/core.py +0 -0
  293. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/registry/introspection.py +0 -0
  294. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/trusted_html.py +0 -0
  295. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/types.py +0 -0
  296. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/primitives/typing.py +0 -0
  297. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/py.typed +0 -0
  298. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/__init__.py +0 -0
  299. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/core.py +0 -0
  300. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/exceptions.py +0 -0
  301. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/operators/__init__.py +0 -0
  302. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/operators/control.py +0 -0
  303. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/operators/time_ops.py +0 -0
  304. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/operators/transform.py +0 -0
  305. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/retry.py +0 -0
  306. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/reactive/subjects.py +0 -0
  307. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/result/__init__.py +0 -0
  308. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/result/_pipeline.py +0 -0
  309. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/result/errors.py +0 -0
  310. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/result/types.py +0 -0
  311. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/result/utils.py +0 -0
  312. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/saga/__init__.py +0 -0
  313. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/saga/base.py +0 -0
  314. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/saga/canonical_json.py +0 -0
  315. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/saga/content_addressed.py +0 -0
  316. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/config.py +0 -0
  317. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/constants.py +0 -0
  318. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/decorators.py +0 -0
  319. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/encryption/__init__.py +0 -0
  320. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/encryption/service.py +0 -0
  321. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/events.py +0 -0
  322. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/exceptions.py +0 -0
  323. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/guards/__init__.py +0 -0
  324. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/guards/decorator.py +0 -0
  325. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/hashing/__init__.py +0 -0
  326. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/hashing/ambient.py +0 -0
  327. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/hashing/digest.py +0 -0
  328. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/hashing/kdf.py +0 -0
  329. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/hooks.py +0 -0
  330. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/py.typed +0 -0
  331. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/sanitization/__init__.py +0 -0
  332. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/sanitization/filename.py +0 -0
  333. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/sanitization/sanitizer.py +0 -0
  334. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/sanitization/url.py +0 -0
  335. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/secrets/__init__.py +0 -0
  336. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/secrets/rotation.py +0 -0
  337. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/secrets/store.py +0 -0
  338. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/secrets/types.py +0 -0
  339. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/security/types.py +0 -0
  340. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/__init__.py +0 -0
  341. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/backends/__init__.py +0 -0
  342. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/backends/json.py +0 -0
  343. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/backends/py.typed +0 -0
  344. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/config.py +0 -0
  345. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/constants.py +0 -0
  346. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/di/__init__.py +0 -0
  347. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/di/provider.py +0 -0
  348. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/di/py.typed +0 -0
  349. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/domain/__init__.py +0 -0
  350. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/domain/py.typed +0 -0
  351. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/exceptions.py +0 -0
  352. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/module.py +0 -0
  353. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/py.typed +0 -0
  354. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/registry/__init__.py +0 -0
  355. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/registry/py.typed +0 -0
  356. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/registry/registry.py +0 -0
  357. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/schema/__init__.py +0 -0
  358. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/schema/py.typed +0 -0
  359. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/serialization/types.py +0 -0
  360. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/types.py +0 -0
  361. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/config.py +0 -0
  362. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/constants.py +0 -0
  363. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/decorators.py +0 -0
  364. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/engine/__init__.py +0 -0
  365. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/engine/py.typed +0 -0
  366. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/engine/validator.py +0 -0
  367. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/exceptions.py +0 -0
  368. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/module.py +0 -0
  369. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/py.typed +0 -0
  370. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/rules/__init__.py +0 -0
  371. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/rules/py.typed +0 -0
  372. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/rules/rules.py +0 -0
  373. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/schema/introspection.py +0 -0
  374. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/schema/py.typed +0 -0
  375. {quadkit-0.0.46 → quadkit-0.0.50}/src/quadkit/validation/types.py +0 -0
  376. {quadkit-0.0.46 → quadkit-0.0.50}/tests/conftest.py +0 -0
  377. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/__init__.py +0 -0
  378. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/__init__.py +0 -0
  379. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/_fixtures.py +0 -0
  380. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/conftest.py +0 -0
  381. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_boot_level.py +0 -0
  382. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_cross_method.py +0 -0
  383. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_dependency_chain.py +0 -0
  384. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_exports.py +0 -0
  385. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_importers.py +0 -0
  386. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_module_health_integration.py +0 -0
  387. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
  388. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_name_lookup.py +0 -0
  389. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
  390. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
  391. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
  392. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
  393. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/test_corrected_patterns_integration.py +0 -0
  394. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/test_database_integration.py +0 -0
  395. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/test_full_pipeline.py +0 -0
  396. {quadkit-0.0.46 → quadkit-0.0.50}/tests/integration/test_monitor_config_integration.py +0 -0
  397. {quadkit-0.0.46 → quadkit-0.0.50}/tests/test.md +0 -0
  398. {quadkit-0.0.46 → quadkit-0.0.50}/tests/test_import_diagnostic.py +0 -0
  399. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/__init__.py +0 -0
  400. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/aop/test_interceptor_timeout.py +0 -0
  401. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/clock/test_clock.py +0 -0
  402. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/codegen/__init__.py +0 -0
  403. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/codegen/test_generator_base.py +0 -0
  404. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/codegen/test_staged_generation.py +0 -0
  405. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/codegen/test_template_overrides.py +0 -0
  406. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/conftest.py +0 -0
  407. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_bounded_channel.py +0 -0
  408. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_channel.py +0 -0
  409. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_channel_close_wakes_receivers.py +0 -0
  410. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_config.py +0 -0
  411. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
  412. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
  413. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
  414. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
  415. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
  416. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
  417. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_config_pool.py +0 -0
  418. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_dispatcher.py +0 -0
  419. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/concurrency/test_sync_bridge.py +0 -0
  420. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_config_constants_new.py +0 -0
  421. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_config_protocols.py +0 -0
  422. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_env_interpolation.py +0 -0
  423. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_logging_redaction_config.py +0 -0
  424. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_logging_sampling.py +0 -0
  425. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_profile_overlay.py +0 -0
  426. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_scoping.py +0 -0
  427. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_secrets_validator.py +0 -0
  428. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/config/test_strict_bool_env.py +0 -0
  429. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/test_context_correlation.py +0 -0
  430. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/test_core_constants.py +0 -0
  431. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/test_core_types.py +0 -0
  432. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/test_request_context_di.py +0 -0
  433. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/test_typing.py +0 -0
  434. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/core/validation/test_protocols.py +0 -0
  435. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/__init__.py +0 -0
  436. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/integration/test_provider.py +0 -0
  437. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/__init__.py +0 -0
  438. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/conftest.py +0 -0
  439. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_compiler.py +0 -0
  440. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_decorator.py +0 -0
  441. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_dynamic.py +0 -0
  442. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_errors.py +0 -0
  443. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_global.py +0 -0
  444. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_graph_reflection.py +0 -0
  445. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_health_graph.py +0 -0
  446. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_integration.py +0 -0
  447. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_introspection.py +0 -0
  448. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_lifecycle.py +0 -0
  449. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_module_lifecycle.py +0 -0
  450. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_reexport.py +0 -0
  451. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_registry.py +0 -0
  452. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_stub_compiler.py +0 -0
  453. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_stub_decorator.py +0 -0
  454. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/module/test_visibility.py +0 -0
  455. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_advanced_features.py +0 -0
  456. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_container_basics.py +0 -0
  457. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_container_builder.py +0 -0
  458. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_container_freeze.py +0 -0
  459. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_container_hardening.py +0 -0
  460. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_container_visibility.py +0 -0
  461. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_decorators.py +0 -0
  462. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_descriptor.py +0 -0
  463. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_di_constants_new.py +0 -0
  464. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_di_decorators.py +0 -0
  465. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
  466. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_diagnostics.py +0 -0
  467. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_extensions_discovery.py +0 -0
  468. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_extensions_validator.py +0 -0
  469. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_function_provider_boot.py +0 -0
  470. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_graph_validator.py +0 -0
  471. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_interceptor_registry.py +0 -0
  472. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_invoker_unit.py +0 -0
  473. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
  474. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_module_validation.py +0 -0
  475. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_module_visibility_boot.py +0 -0
  476. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
  477. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_named_binding.py +0 -0
  478. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_orchestrator_health.py +0 -0
  479. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_basics.py +0 -0
  480. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_config_injection.py +0 -0
  481. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_conformance.py +0 -0
  482. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_orchestration.py +0 -0
  483. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_reset_state.py +0 -0
  484. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_provider_utils.py +0 -0
  485. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_scope_concurrency.py +0 -0
  486. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_scope_manager.py +0 -0
  487. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_service_store.py +0 -0
  488. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_type_hints.py +0 -0
  489. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/di/test_validation.py +0 -0
  490. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/conftest.py +0 -0
  491. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_aggregates.py +0 -0
  492. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain.py +0 -0
  493. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_constants.py +0 -0
  494. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_exceptions.py +0 -0
  495. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_hydration.py +0 -0
  496. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_init.py +0 -0
  497. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_model_strict.py +0 -0
  498. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_domain_module.py +0 -0
  499. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_models_factory.py +0 -0
  500. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/domain/test_value_object.py +0 -0
  501. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/identity/test_identity.py +0 -0
  502. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/logging/test_logging_constants_new.py +0 -0
  503. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/conftest.py +0 -0
  504. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_auto_map.py +0 -0
  505. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_auto_map_dataclass.py +0 -0
  506. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_exceptions.py +0 -0
  507. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
  508. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
  509. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_mapping_mapper.py +0 -0
  510. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_mapping_module.py +0 -0
  511. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_mapping_types.py +0 -0
  512. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_protocol.py +0 -0
  513. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/mapping/test_registry.py +0 -0
  514. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/conftest.py +0 -0
  515. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_builtins.py +0 -0
  516. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_chain.py +0 -0
  517. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_config_alignment.py +0 -0
  518. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_exception_filters.py +0 -0
  519. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_chain.py +0 -0
  520. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_constants.py +0 -0
  521. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
  522. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
  523. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
  524. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_module.py +0 -0
  525. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_routing.py +0 -0
  526. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_middleware_types.py +0 -0
  527. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
  528. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_registry_defaults.py +0 -0
  529. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
  530. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/plugins/test_discovery.py +0 -0
  531. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/plugins/test_engine.py +0 -0
  532. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/plugins/test_state.py +0 -0
  533. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/plugins/test_validation.py +0 -0
  534. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/primitives/test_primitives_constants.py +0 -0
  535. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/primitives/test_public_surface_is_static.py +0 -0
  536. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/primitives/test_registry_advanced.py +0 -0
  537. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/primitives/test_registry_introspection.py +0 -0
  538. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/primitives/test_trusted_html.py +0 -0
  539. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_control.py +0 -0
  540. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_core.py +0 -0
  541. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_facade.py +0 -0
  542. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_retry.py +0 -0
  543. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_subjects.py +0 -0
  544. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_time_ops.py +0 -0
  545. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/reactive/test_transform.py +0 -0
  546. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/__init__.py +0 -0
  547. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_exceptions.py +0 -0
  548. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_hashing.py +0 -0
  549. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_package_hooks_p2.py +0 -0
  550. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_secret_rotation_policy.py +0 -0
  551. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_secrets_rotation.py +0 -0
  552. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_secrets_store.py +0 -0
  553. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_security_api.py +0 -0
  554. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_security_components_p2.py +0 -0
  555. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_security_constants.py +0 -0
  556. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_security_exceptions.py +0 -0
  557. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/security/test_security_types.py +0 -0
  558. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/conftest.py +0 -0
  559. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_schema.py +0 -0
  560. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_constants.py +0 -0
  561. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
  562. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_domain.py +0 -0
  563. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_init.py +0 -0
  564. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_json.py +0 -0
  565. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_registry.py +0 -0
  566. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/serialization/test_serialization_types.py +0 -0
  567. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_boot_validation.py +0 -0
  568. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_config_and_misc.py +0 -0
  569. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_constants.py +0 -0
  570. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_health_baseline.py +0 -0
  571. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_health_config.py +0 -0
  572. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_runner_and_lifespan.py +0 -0
  573. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_types.py +0 -0
  574. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_app_validation_and_misc.py +0 -0
  575. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_application.py +0 -0
  576. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_application_base.py +0 -0
  577. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_application_lifecycle.py +0 -0
  578. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_base_and_misc_exceptions.py +0 -0
  579. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
  580. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_codegen.py +0 -0
  581. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_compiler_graph_utils.py +0 -0
  582. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_component_exceptions.py +0 -0
  583. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_concurrency_constants.py +0 -0
  584. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_concurrency_exceptions.py +0 -0
  585. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config.py +0 -0
  586. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_constants.py +0 -0
  587. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_hardening.py +0 -0
  588. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_quadkit.py +0 -0
  589. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_requirements.py +0 -0
  590. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_sources.py +0 -0
  591. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_types.py +0 -0
  592. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_config_watcher.py +0 -0
  593. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_container_exceptions.py +0 -0
  594. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_container_introspection.py +0 -0
  595. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_container_override.py +0 -0
  596. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_container_resolver_impl.py +0 -0
  597. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_container_runtime_mixin.py +0 -0
  598. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_context_registry.py +0 -0
  599. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_contract_completeness.py +0 -0
  600. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_core_builder.py +0 -0
  601. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_core_constants.py +0 -0
  602. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_core_lazy.py +0 -0
  603. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_core_module.py +0 -0
  604. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_core_pipeline.py +0 -0
  605. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_dependency_injector.py +0 -0
  606. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_di_constants.py +0 -0
  607. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_di_descriptor.py +0 -0
  608. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_di_module_constants.py +0 -0
  609. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_domain_constants.py +0 -0
  610. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_domain_exceptions.py +0 -0
  611. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_dynamic_module.py +0 -0
  612. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_events_security_exceptions.py +0 -0
  613. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_execution_result.py +0 -0
  614. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_hatch_build_targets.py +0 -0
  615. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_health_probes.py +0 -0
  616. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_hook_registry.py +0 -0
  617. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_hook_registry_edge_cases.py +0 -0
  618. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_hook_registry_introspection.py +0 -0
  619. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_hook_registry_scenarios.py +0 -0
  620. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_identity_generators_and_ambient.py +0 -0
  621. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_infra_exceptions.py +0 -0
  622. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_input_sanitizers.py +0 -0
  623. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_interceptors.py +0 -0
  624. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_json_serialization_backend.py +0 -0
  625. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_apply_redaction.py +0 -0
  626. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_bridging.py +0 -0
  627. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_constants.py +0 -0
  628. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_debug.py +0 -0
  629. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_di_provider.py +0 -0
  630. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_factory.py +0 -0
  631. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_redaction.py +0 -0
  632. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_redaction_compound.py +0 -0
  633. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_logging_types.py +0 -0
  634. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_m13_m14_verification.py +0 -0
  635. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_mapper.py +0 -0
  636. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_mapper_enhanced.py +0 -0
  637. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_mapping.py +0 -0
  638. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_middleware_enhancements.py +0 -0
  639. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_middleware_exceptions.py +0 -0
  640. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_middleware_new.py +0 -0
  641. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_module_decorator.py +0 -0
  642. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_module_scan_and_provide.py +0 -0
  643. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_module_system.py +0 -0
  644. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_no_db_imports.py +0 -0
  645. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_observability.py +0 -0
  646. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_orchestrator_parallel.py +0 -0
  647. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_p2_scope_log_level.py +0 -0
  648. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_primitives_context.py +0 -0
  649. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_primitives_data.py +0 -0
  650. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_primitives_registry.py +0 -0
  651. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_provider_boot_enhanced.py +0 -0
  652. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_provider_decorator.py +0 -0
  653. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_quadkit_constants.py +0 -0
  654. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_quadkit_exceptions.py +0 -0
  655. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_repr_helpers.py +0 -0
  656. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_resilience_exceptions.py +0 -0
  657. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_combinators.py +0 -0
  658. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_core.py +0 -0
  659. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_pipeline.py +0 -0
  660. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_pipeline_and_utils.py +0 -0
  661. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_types_new.py +0 -0
  662. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_result_utils.py +0 -0
  663. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_round22_hardening.py +0 -0
  664. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_round41_hardening.py +0 -0
  665. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_saga_primitives.py +0 -0
  666. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_sampling_and_config.py +0 -0
  667. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_secret_stores_and_rotation.py +0 -0
  668. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_serialization_constants.py +0 -0
  669. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_serialization_exceptions.py +0 -0
  670. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_service_descriptor.py +0 -0
  671. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_structured_logging.py +0 -0
  672. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_time_ops.py +0 -0
  673. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_types.py +0 -0
  674. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_validation_coercion.py +0 -0
  675. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_validation_exceptions.py +0 -0
  676. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_validation_rules.py +0 -0
  677. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/test_validation_validator_engine.py +0 -0
  678. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/__init__.py +0 -0
  679. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/conftest.py +0 -0
  680. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_async_validator.py +0 -0
  681. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_helpers.py +0 -0
  682. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation.py +0 -0
  683. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_constants.py +0 -0
  684. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_constants_new.py +0 -0
  685. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_fields.py +0 -0
  686. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_fields_extended.py +0 -0
  687. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_init.py +0 -0
  688. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_introspection.py +0 -0
  689. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_module.py +0 -0
  690. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validation_types.py +0 -0
  691. {quadkit-0.0.46 → quadkit-0.0.50}/tests/unit/validation/test_validator.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: quadkit
3
- Version: 0.0.46
3
+ Version: 0.0.50
4
4
  Summary: Async-first DI/IoC framework for Python — core package
5
5
  Project-URL: Homepage, https://oridecon.dev
6
6
  Project-URL: Repository, https://github.com/dbtinoy-/quadkit
@@ -28,7 +28,7 @@ Requires-Python: >=3.11
28
28
  Requires-Dist: orjson<4,>=3.0.0
29
29
  Requires-Dist: pydantic<3,>=2.10.0
30
30
  Requires-Dist: pyyaml<7,>=6.0.0
31
- Requires-Dist: quadkit-contracts>=0.0.2
31
+ Requires-Dist: quadkit-contracts>=0.0.50
32
32
  Requires-Dist: structlog<27,>=25.1.0
33
33
  Provides-Extra: codegen
34
34
  Requires-Dist: jinja2<4,>=3.1.0; extra == 'codegen'
@@ -39,6 +39,8 @@ Requires-Dist: ruff<1,>=0.16.4; extra == 'dev'
39
39
  Provides-Extra: docs
40
40
  Requires-Dist: mkdocs-material<10,>=9.0.0; extra == 'docs'
41
41
  Requires-Dist: mkdocs<2,>=1.4.0; extra == 'docs'
42
+ Provides-Extra: email
43
+ Requires-Dist: email-validator<3,>=2.0.0; extra == 'email'
42
44
  Provides-Extra: security
43
45
  Requires-Dist: cryptography<52,>=41.0.0; extra == 'security'
44
46
  Provides-Extra: test
@@ -47,7 +49,7 @@ Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'test'
47
49
  Requires-Dist: pytest-mock<4,>=3.10.0; extra == 'test'
48
50
  Requires-Dist: pytest<10,>=8.0.0; extra == 'test'
49
51
  Provides-Extra: web
50
- Requires-Dist: quadkit-web[granian]>=0.0.2; extra == 'web'
52
+ Requires-Dist: quadkit-web[granian]>=0.0.50; extra == 'web'
51
53
  Description-Content-Type: text/markdown
52
54
 
53
55
  # quadkit
@@ -251,10 +253,10 @@ report vulnerabilities privately per
251
253
 
252
254
  ## Stability
253
255
 
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
+ Version `0.0.50` in the `0.x` series, versioned independently of the
257
+ other distributions; APIs may change between minor versions until
256
258
  1.0 — pin an exact version
257
- (`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
259
+ (`quadkit==0.0.50`) or a tight range (`>=0.0.50,<0.1.0`). Full policy:
258
260
  [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
259
261
 
260
262
  ## Links
@@ -199,10 +199,10 @@ report vulnerabilities privately per
199
199
 
200
200
  ## Stability
201
201
 
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
202
+ Version `0.0.50` in the `0.x` series, versioned independently of the
203
+ other distributions; APIs may change between minor versions until
204
204
  1.0 — pin an exact version
205
- (`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
205
+ (`quadkit==0.0.50`) or a tight range (`>=0.0.50,<0.1.0`). Full policy:
206
206
  [stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
207
207
 
208
208
  ## Links
@@ -29,7 +29,7 @@ build-backend = "hatchling.build"
29
29
 
30
30
  [project]
31
31
  name = "quadkit"
32
- version = "0.0.46"
32
+ version = "0.0.50"
33
33
  description = "Async-first DI/IoC framework for Python — core package"
34
34
  readme = "README.md"
35
35
  requires-python = ">=3.11"
@@ -69,7 +69,7 @@ maintainers = [
69
69
  # lifecycle, or exception hierarchy literally cannot function without it.
70
70
 
71
71
  dependencies = [
72
- "quadkit-contracts>=0.0.2",
72
+ "quadkit-contracts>=0.0.50",
73
73
  "orjson>=3.0.0,<4",
74
74
  "structlog>=25.1.0,<27", # Structured logging foundation
75
75
  "pydantic>=2.10.0,<3", # Required: used unconditionally by config, validation
@@ -117,6 +117,11 @@ security = [
117
117
  "cryptography>=41.0.0,<52",
118
118
  ]
119
119
 
120
+ # Validation extras — opt-in RFC 5322 email validation for quadkit.validation.EmailStr
121
+ email = [
122
+ "email-validator>=2.0.0,<3",
123
+ ]
124
+
120
125
  # ── Extension Convenience Groups ──────────────────────────────────────
121
126
  # Users can install entire subsystems via:
122
127
  # pip install quadkit[web] → all web packages
@@ -124,7 +129,7 @@ security = [
124
129
  # ── Web & API ─────────────────────────────────────────────────────────
125
130
 
126
131
  web = [
127
- "quadkit-web[granian]>=0.0.2",
132
+ "quadkit-web[granian]>=0.0.50",
128
133
  ]
129
134
  # NOTE: Convenience extras for the extension packages (db, cache, auth,
130
135
  # events, tasks, monitor, graphql) were removed. Those packages are not
@@ -14,6 +14,7 @@ from typing import Any, Final
14
14
  # Critical: enable namespace-package discovery for quadkit-* distributions.
15
15
  __path__ = pkgutil.extend_path(__path__, __name__)
16
16
 
17
+
17
18
  from quadkit.constants import __version__
18
19
 
19
20
  _ExportSpec = tuple[str, str | None]
@@ -126,6 +127,7 @@ _EXPORTS: Final[dict[str, _ExportSpec]] = {
126
127
  "module": ("quadkit.di.module", "module"),
127
128
  "partition": ("quadkit.result", "partition"),
128
129
  "provide": ("quadkit.di.function_provider", "provide"),
130
+ "refresh_namespace": ("quadkit.primitives.namespace", "refresh_namespace"),
129
131
  "request_context": ("quadkit.primitives.context", "request_scope"),
130
132
  "run_application": ("quadkit.app.runner", "run_application"),
131
133
  "save_disabled": ("quadkit.plugins.state", "save_disabled"),
@@ -260,6 +262,7 @@ __all__ = [
260
262
  "ops",
261
263
  "partition",
262
264
  "provide",
265
+ "refresh_namespace",
263
266
  "request_context",
264
267
  "retry",
265
268
  "run_application",
@@ -26,7 +26,7 @@ from quadkit.logging import get_logger
26
26
  from quadkit.logging.configurator import apply_config as _apply_logging_config
27
27
 
28
28
  if TYPE_CHECKING:
29
- from collections.abc import AsyncIterator
29
+ from collections.abc import AsyncIterator, Iterable
30
30
 
31
31
  from quadkit.di.module.dynamic import DynamicModule
32
32
  from quadkit.di.module.graph import CompiledModuleGraph
@@ -237,8 +237,11 @@ class Application(SecretsMixin, HealthProbeMixin):
237
237
  )
238
238
  self._modules.append(module)
239
239
 
240
- def add_modules(self, modules: list[type | Any]) -> None:
241
- """Add multiple modules. Must be called before ``start()``."""
240
+ def add_modules(self, modules: Iterable[type | Any]) -> None:
241
+ """Register modules in iterable order without mutating the collection.
242
+
243
+ Each item retains the same pre-start guard as ``add_module``.
244
+ """
242
245
  for mod in modules:
243
246
  self.add_module(mod)
244
247
 
@@ -380,8 +383,8 @@ class Application(SecretsMixin, HealthProbeMixin):
380
383
  sys.stderr.write("================================\n")
381
384
  sys.stderr.flush()
382
385
  try:
383
- await self._orchestrator.shutdown()
384
- except RuntimeError as cleanup_err:
386
+ await self._lifecycle.shutdown()
387
+ except Exception as cleanup_err: # noqa: BLE001 — preserve the original startup failure
385
388
  self._logger.exception(
386
389
  "application.cleanup_failed",
387
390
  error=str(cleanup_err),
@@ -14,7 +14,7 @@ from pathlib import Path
14
14
  import pkgutil
15
15
  from typing import TYPE_CHECKING, Any
16
16
 
17
- from quadkit.logging import get_logger
17
+ from quadkit.logging import get_logger, safe_error_type
18
18
 
19
19
  if TYPE_CHECKING:
20
20
  from quadkit.di.provider import Provider
@@ -51,11 +51,11 @@ def discover_providers(packages: tuple[str, ...] | list[str]) -> list[Provider]:
51
51
  instance = cls()
52
52
  found.append(instance)
53
53
  logger.debug("discovery.provider.found", provider=cls.__name__)
54
- except Exception: # noqa: BLE001 — a provider that cannot be instantiated without args is skipped, never a discovery failure
54
+ except Exception as exc: # noqa: BLE001 — a provider that cannot be instantiated without args is skipped, never a discovery failure
55
55
  logger.debug(
56
56
  "discovery.provider.skipped",
57
57
  provider=cls.__name__,
58
- reason="instantiation_failed",
58
+ error_type=safe_error_type(exc),
59
59
  )
60
60
 
61
61
  return found
@@ -166,8 +166,12 @@ def _scan_subclasses(package: str, base: type) -> list[type]:
166
166
  try:
167
167
  module = importlib.import_module(modname)
168
168
  results.extend(_collect_subclasses(module, base))
169
- except (ImportError, ModuleNotFoundError, AttributeError) as e:
170
- logger.debug("discovery.module.import_failed", module=modname, error=str(e))
169
+ except (ImportError, ModuleNotFoundError, AttributeError) as exc:
170
+ logger.debug(
171
+ "discovery.module.import_failed",
172
+ module=modname,
173
+ error_type=safe_error_type(exc),
174
+ )
171
175
 
172
176
  # Also scan the root module itself
173
177
  results.extend(_collect_subclasses(root, base))
@@ -180,12 +184,12 @@ def _collect_subclasses(module: Any, base: type) -> list[type]:
180
184
  for attr_name in dir(module):
181
185
  try:
182
186
  obj = getattr(module, attr_name)
183
- except (AttributeError, TypeError) as e:
187
+ except (AttributeError, TypeError) as exc:
184
188
  logger.debug(
185
189
  "discovery.getattr_failed",
186
190
  module=module.__name__,
187
191
  attr=attr_name,
188
- error=str(e),
192
+ error_type=safe_error_type(exc),
189
193
  )
190
194
  continue
191
195
  if (
@@ -227,11 +231,12 @@ def discover_modules_from_entry_points(
227
231
  for ep in importlib.metadata.entry_points(group=group):
228
232
  try:
229
233
  obj = ep.load()
230
- except Exception: # noqa: BLE001
234
+ except Exception as exc: # noqa: BLE001
231
235
  logger.warning(
232
236
  "module_discovery_entry_point_load_failed",
233
237
  group=group,
234
238
  name=ep.name,
239
+ error_type=safe_error_type(exc),
235
240
  )
236
241
  continue
237
242
  if isinstance(obj, type) and issubclass(obj, Module) and obj is not Module:
@@ -241,7 +246,7 @@ def discover_modules_from_entry_points(
241
246
  "module_discovery_entry_point_not_a_module",
242
247
  group=group,
243
248
  name=ep.name,
244
- loaded=repr(obj),
249
+ loaded_type=type(obj).__name__,
245
250
  )
246
251
  return discovered
247
252
 
@@ -268,7 +273,7 @@ def discover_modules_from_directories(
268
273
  for directory in directories:
269
274
  path = Path(directory)
270
275
  if not path.exists() or not path.is_dir():
271
- logger.debug("module_discovery_dir_skipped", path=str(path))
276
+ logger.debug("module_discovery_dir_skipped")
272
277
  continue
273
278
 
274
279
  for candidate in ("plugin.py", "__init__.py"):
@@ -283,10 +288,11 @@ def discover_modules_from_directories(
283
288
  continue
284
289
  mod = importlib.util.module_from_spec(spec)
285
290
  spec.loader.exec_module(mod)
286
- except Exception: # noqa: BLE001
291
+ except Exception as exc: # noqa: BLE001
287
292
  logger.warning(
288
293
  "module_discovery_dir_load_failed",
289
- file=str(file_path),
294
+ candidate=candidate,
295
+ error_type=safe_error_type(exc),
290
296
  )
291
297
  continue
292
298
 
@@ -76,8 +76,10 @@ class ApplicationLifecycle:
76
76
  self._logger.info("application.stopping", name=self._app_name)
77
77
 
78
78
  try:
79
- await self._orchestrator.shutdown()
80
- await self._container.dispose()
79
+ try:
80
+ await self._orchestrator.shutdown()
81
+ finally:
82
+ await self._container.dispose()
81
83
  finally:
82
84
  if self._start_time is not None:
83
85
  self._uptime_seconds = time.monotonic() - self._start_time
@@ -255,10 +255,14 @@ class CoreModule(Module):
255
255
  if name not in consumed and name not in provider_names:
256
256
  providers.append(provider)
257
257
 
258
+ exports = list(_CORE_EXPORTS)
259
+ if config_class is not None and config_class not in exports:
260
+ exports.append(config_class)
261
+
258
262
  return DynamicModule(
259
263
  module=cls,
260
264
  providers=providers, # type: ignore[arg-type]
261
- exports=list(_CORE_EXPORTS),
265
+ exports=exports,
262
266
  is_global=True,
263
267
  )
264
268
 
@@ -219,10 +219,14 @@ class StandardModule(Module):
219
219
  if name not in consumed and name not in provider_names:
220
220
  providers.append(provider)
221
221
 
222
+ exports = list(_STANDARD_EXPORTS)
223
+ if config_class is not None and config_class not in exports:
224
+ exports.append(config_class)
225
+
222
226
  return DynamicModule(
223
227
  module=cls,
224
228
  providers=providers,
225
- exports=list(_STANDARD_EXPORTS),
229
+ exports=exports,
226
230
  is_global=True,
227
231
  )
228
232
 
@@ -0,0 +1,30 @@
1
+ from quadkit.codegen.base import GeneratorBase
2
+ from quadkit.codegen.field_types import annotation_for, import_lines
3
+ from quadkit.contracts.cli.generators import (
4
+ GenerationResult,
5
+ derived_index_name,
6
+ pluralize_identifier,
7
+ )
8
+ from quadkit.contracts.cli.parsers import (
9
+ EntitySpec,
10
+ FieldSpec,
11
+ IndexSpec,
12
+ format_fields,
13
+ parse_fields,
14
+ resolve_field_specs,
15
+ )
16
+
17
+ __all__ = [
18
+ "EntitySpec",
19
+ "FieldSpec",
20
+ "GenerationResult",
21
+ "GeneratorBase",
22
+ "IndexSpec",
23
+ "annotation_for",
24
+ "derived_index_name",
25
+ "format_fields",
26
+ "import_lines",
27
+ "parse_fields",
28
+ "pluralize_identifier",
29
+ "resolve_field_specs",
30
+ ]
@@ -21,6 +21,9 @@ from quadkit.contracts.cli.generators import (
21
21
  from quadkit.contracts.cli.generators import (
22
22
  pascal_case as pascal_case,
23
23
  )
24
+ from quadkit.contracts.cli.generators import (
25
+ pluralize_identifier as pluralize_identifier,
26
+ )
24
27
  from quadkit.contracts.cli.generators import (
25
28
  resolve_options as resolve_options,
26
29
  )
@@ -44,6 +47,11 @@ class GeneratorBase:
44
47
  and guarded file writes work without it.
45
48
  """
46
49
 
50
+ #: Whether ``generate`` accepts and honors a structured
51
+ #: :class:`quadkit.contracts.cli.EntitySpec`. This is explicit opt-in:
52
+ #: bridges must never infer support merely from ``**options``.
53
+ supports_entity_spec: bool = False
54
+
47
55
  def __init__(
48
56
  self,
49
57
  output_dir: str | Path = "src",
@@ -312,6 +320,10 @@ class GeneratorBase:
312
320
  def _to_snake_case(name: str) -> str:
313
321
  return snake_case(name)
314
322
 
323
+ @staticmethod
324
+ def _pluralize(name: str) -> str:
325
+ return pluralize_identifier(name)
326
+
315
327
  @classmethod
316
328
  def _validate_component_name(cls, name: str) -> str:
317
329
  return validate_component_name(name)
@@ -5,7 +5,7 @@ from __future__ import annotations
5
5
  import asyncio
6
6
  from typing import TYPE_CHECKING, Any
7
7
 
8
- from quadkit.logging import get_logger
8
+ from quadkit.logging import get_logger, safe_error_type
9
9
 
10
10
  if TYPE_CHECKING:
11
11
  from collections.abc import Callable, Coroutine
@@ -96,10 +96,9 @@ class TaskManager:
96
96
  ):
97
97
  raise
98
98
  if isinstance(exc, Exception):
99
- self._logger.exception(
99
+ self._logger.error(
100
100
  "task_manager.periodic_task_error",
101
- task=name or "unnamed",
102
- error=str(exc),
101
+ error_type=safe_error_type(exc),
103
102
  )
104
103
  continue
105
104
  raise
@@ -146,11 +145,6 @@ class TaskManager:
146
145
  timed_out=len(pending),
147
146
  timeout=critical_timeout,
148
147
  )
149
- for task in pending:
150
- self._logger.warning(
151
- "task_manager.critical_incomplete",
152
- task=task.get_name(),
153
- )
154
148
 
155
149
  # Phase 2: Cancel background tasks
156
150
  if self._background:
@@ -211,7 +205,6 @@ class TaskManager:
211
205
  task.add_done_callback(target_set.discard)
212
206
  self._logger.debug(
213
207
  "task.created",
214
- name=task_name,
215
208
  priority="critical" if critical else "background",
216
209
  )
217
210
  return task
@@ -11,7 +11,7 @@ import asyncio
11
11
  from collections.abc import Coroutine
12
12
  from typing import Any, TypeVar
13
13
 
14
- from quadkit.logging import get_logger
14
+ from quadkit.logging import get_logger, safe_error_type
15
15
 
16
16
  logger = get_logger(__name__)
17
17
 
@@ -30,8 +30,7 @@ def _handle_task_exception(task: asyncio.Task[Any]) -> None:
30
30
  if exc is not None:
31
31
  logger.error(
32
32
  "background_task_failed",
33
- task_name=task.get_name(),
34
- exc_info=exc,
33
+ error_type=safe_error_type(exc),
35
34
  )
36
35
 
37
36
 
@@ -105,7 +105,6 @@ class BaseConfig(DomainModel):
105
105
  else:
106
106
  logger.info(
107
107
  "config.defaults_only",
108
- path=str(yaml_path),
109
108
  hint="create application.yaml or set QK_* env vars",
110
109
  )
111
110
 
@@ -242,7 +241,8 @@ class BaseConfig(DomainModel):
242
241
  cls,
243
242
  profile: str | None = None,
244
243
  *,
245
- base_path: str | Path = ".",
244
+ base_path: str | Path | None = None,
245
+ fallback_path: str | Path | None = None,
246
246
  section: str | None = None,
247
247
  ) -> Self:
248
248
  """Load config for a named environment profile.
@@ -269,7 +269,11 @@ class BaseConfig(DomainModel):
269
269
  Args:
270
270
  profile: Environment profile name. When ``None``, the
271
271
  ``QK_PROFILE`` env-var is used.
272
- base_path: Directory containing the profile YAML files.
272
+ base_path: Directory containing the profile YAML files (defaults to
273
+ the current working directory when ``None``).
274
+ fallback_path: Optional secondary directory (such as a workspace
275
+ member's package root) consulted when ``application.yaml`` is
276
+ not present in *base_path*.
273
277
  section: Override the section key for this call. When omitted,
274
278
  :attr:`config_section` is used automatically.
275
279
 
@@ -281,9 +285,13 @@ class BaseConfig(DomainModel):
281
285
  # Explicit override (e.g. non-standard nesting)
282
286
  config = CacheConfig.from_env_profile(section="services.cache")
283
287
  """
284
- return cls.from_yaml(
285
- Path(base_path) / "application.yaml", profile=profile, section=section
286
- )
288
+ resolved_base = Path(base_path) if base_path is not None else Path()
289
+ yaml_file = resolved_base / "application.yaml"
290
+ if not yaml_file.exists() and fallback_path is not None:
291
+ candidate = Path(fallback_path) / "application.yaml"
292
+ if candidate.exists():
293
+ yaml_file = candidate
294
+ return cls.from_yaml(yaml_file, profile=profile, section=section)
287
295
 
288
296
  @classmethod
289
297
  def from_dict(cls, data: dict[str, Any]) -> Self:
@@ -23,15 +23,13 @@ from quadkit.config.lib import (
23
23
  )
24
24
  from quadkit.config.main import QuadkitConfig
25
25
  from quadkit.contracts.core.config import ConfigProtocol
26
+ from quadkit.contracts.core.di import ContainerResolverProtocol
26
27
  from quadkit.contracts.core.health import HealthCheckResult, HealthStatus
27
28
  from quadkit.di.provider import Provider, ProviderPriority
28
- from quadkit.logging import get_logger
29
+ from quadkit.logging import get_logger, safe_error_type
29
30
 
30
31
  if TYPE_CHECKING:
31
- from quadkit.contracts.core.di import (
32
- ContainerRegistrarProtocol,
33
- ContainerResolverProtocol,
34
- )
32
+ from quadkit.contracts.core.di import ContainerRegistrarProtocol
35
33
 
36
34
  logger = get_logger(__name__)
37
35
 
@@ -70,34 +68,56 @@ class ConfigProvider(Provider):
70
68
  async def register(self, container: ContainerRegistrarProtocol) -> None:
71
69
  """Load configuration and register as a singleton."""
72
70
  if self._config_instance is None:
73
- from pathlib import Path
74
-
75
- loader = ConfigLoader()
76
-
77
- # 1. Check for default application.yaml in CWD
78
- yaml_path = Path.cwd() / "application.yaml"
79
- try:
80
- if yaml_path.exists():
81
- loader.add_source(FileConfigSource(yaml_path))
82
- except (FileNotFoundError, OSError) as e:
83
- logger.debug("no_default_config", path=str(yaml_path), reason=str(e))
84
-
85
- # 2. Add custom sources if provided
86
- if self.sources:
87
- for source in self.sources:
88
- loader.add_source(source)
89
-
90
- # 3. Always add env vars
91
- prefix = self.env_prefix or "QK_"
92
- loader.add_source(EnvironmentConfigSource(prefix))
93
-
94
- # 4. Load and apply registry
95
- self._config_instance = loader.load_sync(self.config_class)
96
- self._registry.apply_to_instance(self._config_instance)
71
+ section = (
72
+ getattr(self.config_class, "config_section", "")
73
+ if not issubclass(self.config_class, QuadkitConfig)
74
+ else ""
75
+ )
76
+ if (
77
+ section
78
+ and not self.sources
79
+ and not self.env_prefix
80
+ and isinstance(container, ContainerResolverProtocol)
81
+ and container.has(QuadkitConfig)
82
+ ):
83
+ quadkit_cfg = await container.resolve(QuadkitConfig)
84
+ self._config_instance = quadkit_cfg.get_section(
85
+ section, self.config_class
86
+ )
87
+ self._registry.apply_to_instance(self._config_instance)
88
+ else:
89
+ from pathlib import Path
90
+
91
+ loader = ConfigLoader()
92
+
93
+ # 1. Check for default application.yaml in CWD
94
+ yaml_path = Path.cwd() / "application.yaml"
95
+ try:
96
+ if yaml_path.exists():
97
+ loader.add_source(FileConfigSource(yaml_path))
98
+ except (FileNotFoundError, OSError) as exc:
99
+ logger.debug(
100
+ "no_default_config",
101
+ error_type=safe_error_type(exc),
102
+ )
103
+
104
+ # 2. Add custom sources if provided
105
+ if self.sources:
106
+ for source in self.sources:
107
+ loader.add_source(source)
108
+
109
+ # 3. Always add env vars
110
+ prefix = self.env_prefix or "QK_"
111
+ loader.add_source(EnvironmentConfigSource(prefix))
112
+
113
+ # 4. Load and apply registry
114
+ self._config_instance = loader.load_sync(self.config_class)
115
+ self._registry.apply_to_instance(self._config_instance)
97
116
 
98
117
  # 5. Register with multiple keys for compatibility
99
118
  container.singleton(self.config_class, instance=self._config_instance)
100
- container.singleton(ConfigProtocol, instance=self._config_instance)
119
+ if hasattr(self._config_instance, "get_section"):
120
+ container.singleton(ConfigProtocol, instance=self._config_instance)
101
121
  # Also register as QuadkitConfig if it's a subclass of QuadkitConfig
102
122
  # and not already registered as the main config_class.
103
123
  if self.config_class is not QuadkitConfig and isinstance(