quadkit 0.0.2__tar.gz → 0.0.4__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 (683) hide show
  1. {quadkit-0.0.2 → quadkit-0.0.4}/.gitignore +18 -25
  2. quadkit-0.0.4/PKG-INFO +270 -0
  3. quadkit-0.0.4/README.md +219 -0
  4. quadkit-0.0.4/docs/ARCHITECTURE.md +252 -0
  5. quadkit-0.0.4/docs/CONFIGURATION.md +126 -0
  6. quadkit-0.0.4/docs/GUIDE.md +451 -0
  7. quadkit-0.0.4/docs/HOWTOS.md +275 -0
  8. quadkit-0.0.4/docs/QUICKSTART.md +91 -0
  9. quadkit-0.0.4/docs/SECURITY.md +165 -0
  10. quadkit-0.0.4/docs/TROUBLESHOOTING.md +217 -0
  11. quadkit-0.0.4/docs/gifs/hero/app.py +455 -0
  12. quadkit-0.0.4/docs/gifs/hero/hero.tape +71 -0
  13. quadkit-0.0.4/docs/gifs/hero/quadkit-hero.gif +0 -0
  14. quadkit-0.0.4/docs/plugins.md +54 -0
  15. {quadkit-0.0.2 → quadkit-0.0.4}/example.yaml +0 -17
  16. {quadkit-0.0.2 → quadkit-0.0.4}/pyproject.toml +16 -17
  17. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/base.py +3 -1
  18. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/health_probes.py +32 -6
  19. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/config.py +0 -15
  20. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/constants.py +0 -4
  21. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/executors/dispatcher.py +5 -4
  22. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/base.py +3 -1
  23. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/container.py +8 -222
  24. quadkit-0.0.4/src/quadkit/di/container/container_resolution.py +292 -0
  25. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/registrar.py +26 -0
  26. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/decorators.py +7 -0
  27. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/function_provider.py +16 -7
  28. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/collect.py +2 -1
  29. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/errors.py +6 -4
  30. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/lifecycle.py +20 -5
  31. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/registry.py +17 -0
  32. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/resolver.py +5 -3
  33. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/__init__.py +0 -5
  34. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/factory.py +2 -1
  35. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/processors.py +1 -1
  36. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/redaction.py +11 -0
  37. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/__init__.py +0 -1
  38. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/caching.py +3 -1
  39. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/routing.py +5 -2
  40. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/validation.py +5 -3
  41. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/config.py +2 -15
  42. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/constants.py +0 -4
  43. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/context_registry.py +15 -0
  44. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/config.py +1 -1
  45. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/sanitization/sanitizer.py +27 -8
  46. quadkit-0.0.4/tests/integration/test_corrected_patterns_integration.py +254 -0
  47. quadkit-0.0.4/tests/integration/test_database_integration.py +256 -0
  48. quadkit-0.0.4/tests/integration/test_monitor_config_integration.py +22 -0
  49. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/codegen/test_generator_base.py +3 -33
  50. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/codegen/test_template_overrides.py +3 -3
  51. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_config.py +0 -6
  52. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_constants.py +0 -5
  53. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -4
  54. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_exceptions.py +7 -0
  55. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_config_pool.py +0 -15
  56. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_env_interpolation.py +1 -1
  57. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_logging_sampling.py +13 -11
  58. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_secrets_validator.py +1 -1
  59. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_strict_sections.py +19 -3
  60. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_container_visibility.py +38 -0
  61. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_di_provider_config_wiring.py +1 -1
  62. quadkit-0.0.4/tests/unit/di/test_function_provider_boot.py +68 -0
  63. quadkit-0.0.4/tests/unit/di/test_module_visibility_boot.py +116 -0
  64. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_config_injection.py +1 -1
  65. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_constants.py +0 -7
  66. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_constants_new.py +0 -4
  67. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_security_components_p2.py +3 -3
  68. quadkit-0.0.4/tests/unit/test_app_health_baseline.py +81 -0
  69. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_base_and_misc_exceptions.py +2 -1
  70. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_concurrency_constants.py +3 -13
  71. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config.py +13 -0
  72. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_context_registry.py +26 -0
  73. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_redaction.py +79 -5
  74. quadkit-0.0.2/PKG-INFO +0 -157
  75. quadkit-0.0.2/README.md +0 -106
  76. quadkit-0.0.2/src/quadkit/domain/config.py +0 -38
  77. quadkit-0.0.2/src/quadkit/security/protocols.py +0 -15
  78. {quadkit-0.0.2 → quadkit-0.0.4}/CHANGELOG.md +0 -0
  79. {quadkit-0.0.2 → quadkit-0.0.4}/LICENSE +0 -0
  80. {quadkit-0.0.2 → quadkit-0.0.4}/NOTICE +0 -0
  81. {quadkit-0.0.2 → quadkit-0.0.4}/src/import_error.txt +0 -0
  82. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/__init__.py +0 -0
  83. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/__init__.py +0 -0
  84. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/asgi_lifespan.py +0 -0
  85. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/config/__init__.py +0 -0
  86. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/config/discovery.py +0 -0
  87. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/config/models.py +0 -0
  88. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/config_validation.py +0 -0
  89. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/constants.py +0 -0
  90. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/di/__init__.py +0 -0
  91. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/di/provider.py +0 -0
  92. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/discovery.py +0 -0
  93. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/events.py +0 -0
  94. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/exceptions.py +0 -0
  95. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/factory.py +0 -0
  96. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/injectable_provider.py +0 -0
  97. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/invoker.py +0 -0
  98. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/lifecycle.py +0 -0
  99. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/module.py +0 -0
  100. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/pipeline.py +0 -0
  101. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/protocols.py +0 -0
  102. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/py.typed +0 -0
  103. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/runner.py +0 -0
  104. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/secrets.py +0 -0
  105. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/standard.py +0 -0
  106. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/app/types.py +0 -0
  107. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/codegen/__init__.py +0 -0
  108. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/codegen/base.py +0 -0
  109. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/__init__.py +0 -0
  110. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/bridges/__init__.py +0 -0
  111. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/bridges/py.typed +0 -0
  112. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
  113. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/channels/__init__.py +0 -0
  114. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/channels/channel.py +0 -0
  115. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/channels/py.typed +0 -0
  116. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/di/__init__.py +0 -0
  117. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/di/provider.py +0 -0
  118. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/di/py.typed +0 -0
  119. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/exceptions.py +0 -0
  120. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/executors/__init__.py +0 -0
  121. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/executors/parallel.py +0 -0
  122. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/executors/py.typed +0 -0
  123. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/executors/task_manager.py +0 -0
  124. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/locks/__init__.py +0 -0
  125. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/locks/py.typed +0 -0
  126. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/locks/rwlock.py +0 -0
  127. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/module.py +0 -0
  128. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/py.typed +0 -0
  129. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/concurrency/task_utils.py +0 -0
  130. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/__init__.py +0 -0
  131. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/constants.py +0 -0
  132. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/di/__init__.py +0 -0
  133. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/di/provider.py +0 -0
  134. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/exceptions.py +0 -0
  135. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/__init__.py +0 -0
  136. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/merge.py +0 -0
  137. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/registry.py +0 -0
  138. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/sources.py +0 -0
  139. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/validation.py +0 -0
  140. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/lib/watcher.py +0 -0
  141. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/main.py +0 -0
  142. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/protocols.py +0 -0
  143. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/secrets.py +0 -0
  144. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/config/types.py +0 -0
  145. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/constants.py +0 -0
  146. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/__init__.py +0 -0
  147. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/_graph.py +0 -0
  148. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/builder.py +0 -0
  149. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/config/__init__.py +0 -0
  150. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/config/models.py +0 -0
  151. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/constants.py +0 -0
  152. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/__init__.py +0 -0
  153. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/container_introspection.py +0 -0
  154. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/container_runtime.py +0 -0
  155. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/resolver.py +0 -0
  156. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/scope.py +0 -0
  157. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/container/validation.py +0 -0
  158. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/context.py +0 -0
  159. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/exceptions.py +0 -0
  160. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/__init__.py +0 -0
  161. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
  162. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/discovery.py +0 -0
  163. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/interceptors.py +0 -0
  164. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/strategies.py +0 -0
  165. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/extensions/validator.py +0 -0
  166. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/integration/__init__.py +0 -0
  167. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/integration/provider.py +0 -0
  168. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/markers.py +0 -0
  169. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/__init__.py +0 -0
  170. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/base.py +0 -0
  171. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/__init__.py +0 -0
  172. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
  173. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/compiler.py +0 -0
  174. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/context.py +0 -0
  175. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
  176. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
  177. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
  178. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/order.py +0 -0
  179. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
  180. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
  181. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
  182. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/constants.py +0 -0
  183. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/decorator.py +0 -0
  184. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/dynamic.py +0 -0
  185. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/graph.py +0 -0
  186. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/introspection.py +0 -0
  187. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/metadata.py +0 -0
  188. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/module/registry.py +0 -0
  189. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/__init__.py +0 -0
  190. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/events.py +0 -0
  191. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/health.py +0 -0
  192. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
  193. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/orchestrator/registry.py +0 -0
  194. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/protocols.py +0 -0
  195. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/provider.py +0 -0
  196. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/provider_utils.py +0 -0
  197. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/py.typed +0 -0
  198. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/__init__.py +0 -0
  199. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/context.py +0 -0
  200. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/descriptor.py +0 -0
  201. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/diagnostics.py +0 -0
  202. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/injector.py +0 -0
  203. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/invoker.py +0 -0
  204. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/store.py +0 -0
  205. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/type_hints.py +0 -0
  206. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/resolution/validator.py +0 -0
  207. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/di/types.py +0 -0
  208. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/constants.py +0 -0
  209. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/exceptions.py +0 -0
  210. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/__init__.py +0 -0
  211. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/aggregate.py +0 -0
  212. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/base.py +0 -0
  213. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/coercion.py +0 -0
  214. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/entity.py +0 -0
  215. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/factory.py +0 -0
  216. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/py.typed +0 -0
  217. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/models/value_object.py +0 -0
  218. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/module.py +0 -0
  219. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/py.typed +0 -0
  220. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/types.py +0 -0
  221. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/domain/unit_of_work.py +0 -0
  222. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/exceptions.py +0 -0
  223. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/hooks/__init__.py +0 -0
  224. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/hooks/ambient.py +0 -0
  225. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/hooks/registry.py +0 -0
  226. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/hooks/types.py +0 -0
  227. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/__init__.py +0 -0
  228. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/ambient.py +0 -0
  229. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/config.py +0 -0
  230. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/constants.py +0 -0
  231. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/di/__init__.py +0 -0
  232. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/di/provider.py +0 -0
  233. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/identity/generator.py +0 -0
  234. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/README.md +0 -0
  235. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/__init__.py +0 -0
  236. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/config/__init__.py +0 -0
  237. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/config/models.py +0 -0
  238. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/config/redaction.py +0 -0
  239. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/config/sampling.py +0 -0
  240. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/configurator.py +0 -0
  241. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/constants.py +0 -0
  242. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/debug.py +0 -0
  243. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/di/__init__.py +0 -0
  244. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/di/provider.py +0 -0
  245. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/logging/types.py +0 -0
  246. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/__init__.py +0 -0
  247. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/config.py +0 -0
  248. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/constants.py +0 -0
  249. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/core/__init__.py +0 -0
  250. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/core/mapper.py +0 -0
  251. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/di/__init__.py +0 -0
  252. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/di/provider.py +0 -0
  253. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/exceptions.py +0 -0
  254. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/module.py +0 -0
  255. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/protocols.py +0 -0
  256. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/py.typed +0 -0
  257. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/mapping/types.py +0 -0
  258. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/__init__.py +0 -0
  259. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/di.py +0 -0
  260. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/observability.py +0 -0
  261. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/builtins/resilience.py +0 -0
  262. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/core/__init__.py +0 -0
  263. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/core/chain.py +0 -0
  264. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/core/exception_filters.py +0 -0
  265. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/core/registry.py +0 -0
  266. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/di/__init__.py +0 -0
  267. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/di/provider.py +0 -0
  268. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/exceptions.py +0 -0
  269. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/module.py +0 -0
  270. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/middleware/types.py +0 -0
  271. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/module.py +0 -0
  272. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/observability/__init__.py +0 -0
  273. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/observability/core.py +0 -0
  274. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/observability/di/__init__.py +0 -0
  275. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
  276. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
  277. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/__init__.py +0 -0
  278. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/discovery.py +0 -0
  279. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/engine.py +0 -0
  280. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/exceptions.py +0 -0
  281. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/module.py +0 -0
  282. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/plugins/state.py +0 -0
  283. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/__init__.py +0 -0
  284. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/builder.py +0 -0
  285. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/clock.py +0 -0
  286. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/constants.py +0 -0
  287. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/context.py +0 -0
  288. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/context_keys.py +0 -0
  289. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/data.py +0 -0
  290. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/di/__init__.py +0 -0
  291. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/di/provider.py +0 -0
  292. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/exceptions.py +0 -0
  293. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/lazy.py +0 -0
  294. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/pipeline.py +0 -0
  295. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/protocols.py +0 -0
  296. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/registry/__init__.py +0 -0
  297. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/registry/core.py +0 -0
  298. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/registry/introspection.py +0 -0
  299. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/trusted_html.py +0 -0
  300. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/types.py +0 -0
  301. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/primitives/typing.py +0 -0
  302. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/py.typed +0 -0
  303. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/__init__.py +0 -0
  304. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/core.py +0 -0
  305. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/exceptions.py +0 -0
  306. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/operators/__init__.py +0 -0
  307. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/operators/control.py +0 -0
  308. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/operators/time_ops.py +0 -0
  309. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/operators/transform.py +0 -0
  310. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/retry.py +0 -0
  311. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/reactive/subjects.py +0 -0
  312. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/result/__init__.py +0 -0
  313. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/result/_pipeline.py +0 -0
  314. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/result/errors.py +0 -0
  315. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/result/types.py +0 -0
  316. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/result/utils.py +0 -0
  317. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/saga/__init__.py +0 -0
  318. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/saga/base.py +0 -0
  319. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/saga/canonical_json.py +0 -0
  320. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/saga/content_addressed.py +0 -0
  321. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/__init__.py +0 -0
  322. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/constants.py +0 -0
  323. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/decorators.py +0 -0
  324. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/encryption/__init__.py +0 -0
  325. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/encryption/service.py +0 -0
  326. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/events.py +0 -0
  327. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/exceptions.py +0 -0
  328. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/guards/__init__.py +0 -0
  329. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/guards/chain.py +0 -0
  330. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/guards/decorator.py +0 -0
  331. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/hashing/__init__.py +0 -0
  332. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/hashing/ambient.py +0 -0
  333. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/hashing/digest.py +0 -0
  334. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/hashing/kdf.py +0 -0
  335. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/hooks.py +0 -0
  336. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/provider.py +0 -0
  337. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/py.typed +0 -0
  338. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/sanitization/__init__.py +0 -0
  339. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/sanitization/filename.py +0 -0
  340. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/sanitization/html.py +0 -0
  341. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/sanitization/url.py +0 -0
  342. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/secrets/__init__.py +0 -0
  343. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/secrets/rotation.py +0 -0
  344. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/secrets/store.py +0 -0
  345. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/secrets/types.py +0 -0
  346. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/security/types.py +0 -0
  347. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/__init__.py +0 -0
  348. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/backends/__init__.py +0 -0
  349. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/backends/json.py +0 -0
  350. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/backends/py.typed +0 -0
  351. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/config.py +0 -0
  352. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/constants.py +0 -0
  353. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/di/__init__.py +0 -0
  354. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/di/provider.py +0 -0
  355. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/di/py.typed +0 -0
  356. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/domain/__init__.py +0 -0
  357. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/domain/domain.py +0 -0
  358. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/domain/py.typed +0 -0
  359. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/exceptions.py +0 -0
  360. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/module.py +0 -0
  361. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/py.typed +0 -0
  362. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/registry/__init__.py +0 -0
  363. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/registry/py.typed +0 -0
  364. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/registry/registry.py +0 -0
  365. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/schema/__init__.py +0 -0
  366. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/schema/py.typed +0 -0
  367. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/schema/schema.py +0 -0
  368. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/serialization/types.py +0 -0
  369. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/types.py +0 -0
  370. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/__init__.py +0 -0
  371. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/config.py +0 -0
  372. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/constants.py +0 -0
  373. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/decorators.py +0 -0
  374. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/engine/__init__.py +0 -0
  375. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/engine/coercion.py +0 -0
  376. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/engine/py.typed +0 -0
  377. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/engine/validator.py +0 -0
  378. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/exceptions.py +0 -0
  379. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/module.py +0 -0
  380. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/py.typed +0 -0
  381. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/rules/__init__.py +0 -0
  382. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/rules/py.typed +0 -0
  383. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/rules/rules.py +0 -0
  384. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/schema/__init__.py +0 -0
  385. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/schema/fields.py +0 -0
  386. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/schema/introspection.py +0 -0
  387. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/schema/py.typed +0 -0
  388. {quadkit-0.0.2 → quadkit-0.0.4}/src/quadkit/validation/types.py +0 -0
  389. {quadkit-0.0.2 → quadkit-0.0.4}/tests/conftest.py +0 -0
  390. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/__init__.py +0 -0
  391. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/__init__.py +0 -0
  392. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/_fixtures.py +0 -0
  393. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/conftest.py +0 -0
  394. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_boot_level.py +0 -0
  395. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_cross_method.py +0 -0
  396. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_dependency_chain.py +0 -0
  397. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_exports.py +0 -0
  398. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_importers.py +0 -0
  399. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_module_health_integration.py +0 -0
  400. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
  401. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_name_lookup.py +0 -0
  402. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
  403. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
  404. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
  405. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
  406. {quadkit-0.0.2 → quadkit-0.0.4}/tests/integration/test_full_pipeline.py +0 -0
  407. {quadkit-0.0.2 → quadkit-0.0.4}/tests/test.md +0 -0
  408. {quadkit-0.0.2 → quadkit-0.0.4}/tests/test_import_diagnostic.py +0 -0
  409. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/__init__.py +0 -0
  410. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/aop/test_interceptor_timeout.py +0 -0
  411. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/clock/test_clock.py +0 -0
  412. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/codegen/__init__.py +0 -0
  413. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/codegen/test_staged_generation.py +0 -0
  414. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/conftest.py +0 -0
  415. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_bounded_channel.py +0 -0
  416. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_channel.py +0 -0
  417. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
  418. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
  419. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
  420. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_dispatcher.py +0 -0
  421. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_sync_bridge.py +0 -0
  422. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_task_manager.py +0 -0
  423. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/concurrency/test_task_utils.py +0 -0
  424. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_config_constants_new.py +0 -0
  425. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_config_protocols.py +0 -0
  426. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_config_sources.py +0 -0
  427. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_loader_fail_fast.py +0 -0
  428. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_logging_redaction_config.py +0 -0
  429. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_profile_overlay.py +0 -0
  430. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_scoping.py +0 -0
  431. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/config/test_strict_bool_env.py +0 -0
  432. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/test_context_correlation.py +0 -0
  433. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/test_core_constants.py +0 -0
  434. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/test_core_types.py +0 -0
  435. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/test_request_context_di.py +0 -0
  436. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/test_typing.py +0 -0
  437. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/core/validation/test_protocols.py +0 -0
  438. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/__init__.py +0 -0
  439. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/integration/test_provider.py +0 -0
  440. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/__init__.py +0 -0
  441. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/conftest.py +0 -0
  442. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_compiler.py +0 -0
  443. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_decorator.py +0 -0
  444. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_dynamic.py +0 -0
  445. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_errors.py +0 -0
  446. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_global.py +0 -0
  447. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_graph_reflection.py +0 -0
  448. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_health_graph.py +0 -0
  449. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_integration.py +0 -0
  450. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_introspection.py +0 -0
  451. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_lifecycle.py +0 -0
  452. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_module_lifecycle.py +0 -0
  453. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_reexport.py +0 -0
  454. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_registry.py +0 -0
  455. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_stub_compiler.py +0 -0
  456. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_stub_decorator.py +0 -0
  457. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/module/test_visibility.py +0 -0
  458. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_advanced_features.py +0 -0
  459. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_container_basics.py +0 -0
  460. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_container_builder.py +0 -0
  461. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_container_freeze.py +0 -0
  462. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_container_hardening.py +0 -0
  463. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_decorators.py +0 -0
  464. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_descriptor.py +0 -0
  465. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_di_constants_new.py +0 -0
  466. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_di_decorators.py +0 -0
  467. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_diagnostics.py +0 -0
  468. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_extensions_discovery.py +0 -0
  469. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_extensions_validator.py +0 -0
  470. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_graph_validator.py +0 -0
  471. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_interceptor_registry.py +0 -0
  472. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_invoker_unit.py +0 -0
  473. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
  474. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_module_validation.py +0 -0
  475. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
  476. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_named_binding.py +0 -0
  477. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_orchestrator_health.py +0 -0
  478. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_basics.py +0 -0
  479. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_conformance.py +0 -0
  480. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_orchestration.py +0 -0
  481. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_reset_state.py +0 -0
  482. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_provider_utils.py +0 -0
  483. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_scope_concurrency.py +0 -0
  484. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_scope_manager.py +0 -0
  485. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_service_store.py +0 -0
  486. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_type_hints.py +0 -0
  487. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/di/test_validation.py +0 -0
  488. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/conftest.py +0 -0
  489. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_aggregates.py +0 -0
  490. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain.py +0 -0
  491. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain_constants.py +0 -0
  492. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain_exceptions.py +0 -0
  493. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain_init.py +0 -0
  494. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain_model_strict.py +0 -0
  495. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_domain_module.py +0 -0
  496. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_models_factory.py +0 -0
  497. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/domain/test_value_object.py +0 -0
  498. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/identity/test_identity.py +0 -0
  499. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/logging/test_logging_constants_new.py +0 -0
  500. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/conftest.py +0 -0
  501. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_auto_map.py +0 -0
  502. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_exceptions.py +0 -0
  503. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
  504. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
  505. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_mapping_mapper.py +0 -0
  506. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_mapping_module.py +0 -0
  507. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_mapping_types.py +0 -0
  508. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_protocol.py +0 -0
  509. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/mapping/test_registry.py +0 -0
  510. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/conftest.py +0 -0
  511. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_builtins.py +0 -0
  512. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_chain.py +0 -0
  513. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_config_alignment.py +0 -0
  514. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_exception_filters.py +0 -0
  515. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_chain.py +0 -0
  516. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
  517. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
  518. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_module.py +0 -0
  519. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_routing.py +0 -0
  520. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_middleware_types.py +0 -0
  521. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
  522. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_registry_defaults.py +0 -0
  523. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
  524. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/plugins/test_discovery.py +0 -0
  525. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/plugins/test_engine.py +0 -0
  526. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/plugins/test_state.py +0 -0
  527. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/plugins/test_state_hardening.py +0 -0
  528. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/plugins/test_validation.py +0 -0
  529. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/primitives/test_primitives_constants.py +0 -0
  530. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/primitives/test_registry_advanced.py +0 -0
  531. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/primitives/test_registry_introspection.py +0 -0
  532. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/primitives/test_trusted_html.py +0 -0
  533. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_control.py +0 -0
  534. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_core.py +0 -0
  535. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_facade.py +0 -0
  536. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_retry.py +0 -0
  537. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_subjects.py +0 -0
  538. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_time_ops.py +0 -0
  539. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/reactive/test_transform.py +0 -0
  540. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/__init__.py +0 -0
  541. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_exceptions.py +0 -0
  542. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_guards.py +0 -0
  543. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_hashing.py +0 -0
  544. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_package_hooks_p2.py +0 -0
  545. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_secret_rotation_policy.py +0 -0
  546. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_secrets_rotation.py +0 -0
  547. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_secrets_store.py +0 -0
  548. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_security_api.py +0 -0
  549. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_security_constants.py +0 -0
  550. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_security_exceptions.py +0 -0
  551. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/security/test_security_types.py +0 -0
  552. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/conftest.py +0 -0
  553. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_schema.py +0 -0
  554. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_constants.py +0 -0
  555. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
  556. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_domain.py +0 -0
  557. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_init.py +0 -0
  558. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_json.py +0 -0
  559. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_registry.py +0 -0
  560. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/serialization/test_serialization_types.py +0 -0
  561. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_boot_validation.py +0 -0
  562. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_config_and_misc.py +0 -0
  563. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_constants.py +0 -0
  564. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_discovery.py +0 -0
  565. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_health_config.py +0 -0
  566. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_runner_and_lifespan.py +0 -0
  567. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_types.py +0 -0
  568. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_app_validation_and_misc.py +0 -0
  569. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_application.py +0 -0
  570. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_application_base.py +0 -0
  571. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_application_lifecycle.py +0 -0
  572. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
  573. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_codegen.py +0 -0
  574. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_compiler_graph_utils.py +0 -0
  575. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_component_exceptions.py +0 -0
  576. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_concurrency_exceptions.py +0 -0
  577. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_constants.py +0 -0
  578. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_hardening.py +0 -0
  579. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_quadkit.py +0 -0
  580. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_requirements.py +0 -0
  581. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_sources.py +0 -0
  582. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_types.py +0 -0
  583. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_config_watcher.py +0 -0
  584. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_container_exceptions.py +0 -0
  585. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_container_introspection.py +0 -0
  586. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_container_override.py +0 -0
  587. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_container_resolver_impl.py +0 -0
  588. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_container_runtime_mixin.py +0 -0
  589. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_contract_completeness.py +0 -0
  590. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_core_builder.py +0 -0
  591. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_core_constants.py +0 -0
  592. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_core_lazy.py +0 -0
  593. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_core_module.py +0 -0
  594. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_core_pipeline.py +0 -0
  595. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_dependency_injector.py +0 -0
  596. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_di_constants.py +0 -0
  597. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_di_descriptor.py +0 -0
  598. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_di_module_constants.py +0 -0
  599. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_domain_constants.py +0 -0
  600. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_domain_exceptions.py +0 -0
  601. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_domain_model_base.py +0 -0
  602. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_dynamic_module.py +0 -0
  603. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_events_security_exceptions.py +0 -0
  604. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_execution_result.py +0 -0
  605. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_hatch_build_targets.py +0 -0
  606. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_health_probes.py +0 -0
  607. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_hook_registry.py +0 -0
  608. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_hook_registry_edge_cases.py +0 -0
  609. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_hook_registry_introspection.py +0 -0
  610. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_hook_registry_scenarios.py +0 -0
  611. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_identity_generators_and_ambient.py +0 -0
  612. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_infra_exceptions.py +0 -0
  613. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_input_sanitizers.py +0 -0
  614. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_interceptors.py +0 -0
  615. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_json_serialization_backend.py +0 -0
  616. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_apply_redaction.py +0 -0
  617. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_bridging.py +0 -0
  618. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_constants.py +0 -0
  619. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_debug.py +0 -0
  620. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_di_provider.py +0 -0
  621. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_factory.py +0 -0
  622. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_init.py +0 -0
  623. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_redaction_compound.py +0 -0
  624. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_logging_types.py +0 -0
  625. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_m13_m14_verification.py +0 -0
  626. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_mapper.py +0 -0
  627. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_mapper_enhanced.py +0 -0
  628. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_mapping.py +0 -0
  629. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_middleware_enhancements.py +0 -0
  630. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_middleware_exceptions.py +0 -0
  631. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_middleware_new.py +0 -0
  632. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_module_decorator.py +0 -0
  633. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_module_scan_and_provide.py +0 -0
  634. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_module_system.py +0 -0
  635. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_no_db_imports.py +0 -0
  636. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_observability.py +0 -0
  637. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_orchestrator_parallel.py +0 -0
  638. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_p2_scope_log_level.py +0 -0
  639. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_primitives_context.py +0 -0
  640. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_primitives_data.py +0 -0
  641. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_primitives_registry.py +0 -0
  642. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_provider_boot_enhanced.py +0 -0
  643. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_provider_decorator.py +0 -0
  644. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_quadkit_constants.py +0 -0
  645. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_quadkit_exceptions.py +0 -0
  646. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_repr_helpers.py +0 -0
  647. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_resilience_exceptions.py +0 -0
  648. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_combinators.py +0 -0
  649. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_core.py +0 -0
  650. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_pipeline.py +0 -0
  651. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_pipeline_and_utils.py +0 -0
  652. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_types_new.py +0 -0
  653. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_result_utils.py +0 -0
  654. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_round22_hardening.py +0 -0
  655. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_round41_hardening.py +0 -0
  656. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_saga_primitives.py +0 -0
  657. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_sampling_and_config.py +0 -0
  658. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_secret_stores_and_rotation.py +0 -0
  659. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_serialization_constants.py +0 -0
  660. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_serialization_exceptions.py +0 -0
  661. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_service_descriptor.py +0 -0
  662. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_structured_logging.py +0 -0
  663. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_time_ops.py +0 -0
  664. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_types.py +0 -0
  665. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_validation_coercion.py +0 -0
  666. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_validation_exceptions.py +0 -0
  667. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_validation_rules.py +0 -0
  668. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/test_validation_validator_engine.py +0 -0
  669. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/__init__.py +0 -0
  670. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/conftest.py +0 -0
  671. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_async_validator.py +0 -0
  672. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_coercion.py +0 -0
  673. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_helpers.py +0 -0
  674. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation.py +0 -0
  675. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_constants.py +0 -0
  676. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_constants_new.py +0 -0
  677. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_fields.py +0 -0
  678. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_fields_extended.py +0 -0
  679. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_init.py +0 -0
  680. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_introspection.py +0 -0
  681. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_module.py +0 -0
  682. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validation_types.py +0 -0
  683. {quadkit-0.0.2 → quadkit-0.0.4}/tests/unit/validation/test_validator.py +0 -0
@@ -28,6 +28,8 @@
28
28
  !.importlinter
29
29
  !.superpowers/
30
30
  !.superpowers/**
31
+ !.gitattributes
32
+ !.editorconfig
31
33
  !Makefile
32
34
  !docker-compose.test.yml
33
35
  !quadkit.yaml.example
@@ -98,69 +100,62 @@ internal-docs/
98
100
  # Editor swap files
99
101
  *.swp
100
102
 
101
- # Tiered package layout (core/, packages/, experimental/<family>/)
102
103
  !core/
103
104
  !packages/
104
- !experimental/
105
- !experimental/*/
106
105
  !core/quadkit*/
107
106
  !packages/quadkit*/
108
- !experimental/*/quadkit*/
109
107
  !core/quadkit*/pyproject.toml
110
108
  !packages/quadkit*/pyproject.toml
111
- !experimental/*/quadkit*/pyproject.toml
112
109
  !core/quadkit*/CHANGELOG.md
113
110
  !packages/quadkit*/CHANGELOG.md
114
- !experimental/*/quadkit*/CHANGELOG.md
115
111
  !core/quadkit*/README.md
116
112
  !packages/quadkit*/README.md
117
- !experimental/*/quadkit*/README.md
118
113
  !core/quadkit*/alembic.ini
119
114
  !packages/quadkit*/alembic.ini
120
- !experimental/*/quadkit*/alembic.ini
121
115
  !core/quadkit*/mypy.ini
122
116
  !packages/quadkit*/mypy.ini
123
- !experimental/*/quadkit*/mypy.ini
124
117
  !core/quadkit*/*.yaml.example
125
118
  !packages/quadkit*/*.yaml.example
126
- !experimental/*/quadkit*/*.yaml.example
127
119
  !core/quadkit*/src/
128
120
  !core/quadkit*/src/**
129
121
  !packages/quadkit*/src/
130
122
  !packages/quadkit*/src/**
131
- !experimental/*/quadkit*/src/
132
- !experimental/*/quadkit*/src/**
133
123
  !core/quadkit*/tests/
134
124
  !core/quadkit*/tests/**
135
125
  !packages/quadkit*/tests/
136
126
  !packages/quadkit*/tests/**
137
- !experimental/*/quadkit*/tests/
138
- !experimental/*/quadkit*/tests/**
139
127
  !core/quadkit*/docs/
140
128
  !core/quadkit*/docs/**
141
129
  !packages/quadkit*/docs/
142
130
  !packages/quadkit*/docs/**
143
- !experimental/*/quadkit*/docs/
144
- !experimental/*/quadkit*/docs/**
145
131
 
146
132
  # dev/
147
133
  !dev/
148
134
  !dev/**
149
135
 
150
136
  # Admin dev playground (committed dev asset; local SQLite files stay ignored)
151
- !experimental/*/quadkit*/playground/
152
- !experimental/*/quadkit*/playground/**
153
- experimental/*/quadkit*/playground/*.db
154
- experimental/*/quadkit*/playground/*.db-*
137
+ !packages/quadkit-admin/playground/
138
+ !packages/quadkit-admin/playground/serve.py
139
+
140
+ # gatewai apps
141
+ !apps/
142
+ !apps/**
143
+ !apps/gatewai/
144
+ !apps/gatewai/**
145
+ apps/**/node_modules/
146
+ apps/**/dist/
147
+ apps/**/__pycache__/
148
+ apps/**/*.pyc
149
+ apps/**/*.db
150
+ apps/**/*.db-wal
151
+ apps/**/*.db-shm
155
152
 
156
153
  # Re-exclude private content under the tiered paths.
157
154
  # MUST come after the !...docs/** negations above — last match wins.
158
155
  core/quadkit*/docs/plans/
159
156
  packages/quadkit*/docs/plans/
160
- experimental/*/quadkit*/docs/plans/
161
157
  core/quadkit*/docs/**/
162
158
  packages/quadkit*/docs/**/
163
- experimental/*/quadkit*/docs/**/
164
159
 
165
160
  # Re-exclude tooling artifacts under the tiered paths
166
161
  __pycache__/
@@ -178,13 +173,11 @@ test.db
178
173
  *.log
179
174
  !core/quadkit*/tests/fixtures/test.db
180
175
  !packages/quadkit*/tests/fixtures/test.db
181
- !experimental/*/quadkit*/tests/fixtures/test.db
182
176
 
183
177
  # Allow the generated example gifs to be tracked (README hero images).
184
178
  !core/quadkit*/docs/gifs/
185
179
  !core/quadkit*/docs/gifs/**
186
180
  !packages/*/quadkit*/docs/gifs/
187
181
  !packages/*/quadkit*/docs/gifs/**
188
- !experimental/*/quadkit*/docs/gifs/
189
- !experimental/*/quadkit*/docs/gifs/**
190
182
  examples/*/screenshot.png
183
+ !banner*
quadkit-0.0.4/PKG-INFO ADDED
@@ -0,0 +1,270 @@
1
+ Metadata-Version: 2.5
2
+ Name: quadkit
3
+ Version: 0.0.4
4
+ Summary: Async-first DI/IoC framework for Python — core package
5
+ Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
6
+ Project-URL: Repository, https://github.com/dbtinoy-/quadkit
7
+ Project-URL: Documentation, https://dbtinoy-.github.io/quadkit/
8
+ Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
9
+ Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
10
+ Author-email: Quadkit Framework Team <team@quadkit.dev>
11
+ Maintainer-email: Quadkit Framework Team <team@quadkit.dev>
12
+ License: Apache-2.0
13
+ License-File: LICENSE
14
+ License-File: NOTICE
15
+ Keywords: async,dependency-injection,framework,ioc,provider-pattern
16
+ Classifier: Development Status :: 3 - Alpha
17
+ Classifier: Framework :: AsyncIO
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: License :: OSI Approved :: Apache Software License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python :: 3
22
+ Classifier: Programming Language :: Python :: 3.11
23
+ Classifier: Programming Language :: Python :: 3.12
24
+ Classifier: Programming Language :: Python :: 3.13
25
+ Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
26
+ Classifier: Typing :: Typed
27
+ Requires-Python: >=3.11
28
+ Requires-Dist: orjson<4,>=3.0.0
29
+ Requires-Dist: pydantic<3,>=2.10.0
30
+ Requires-Dist: quadkit-contracts>=0.0.2
31
+ Requires-Dist: structlog<27,>=25.1.0
32
+ Provides-Extra: codegen
33
+ Requires-Dist: jinja2<4,>=3.1.0; extra == 'codegen'
34
+ Provides-Extra: dev
35
+ Requires-Dist: mypy<3,>=1.0.0; extra == 'dev'
36
+ Requires-Dist: pre-commit<5,>=3.0.0; extra == 'dev'
37
+ Requires-Dist: ruff<1,>=0.16.4; extra == 'dev'
38
+ Provides-Extra: docs
39
+ Requires-Dist: mkdocs-material<10,>=9.0.0; extra == 'docs'
40
+ Requires-Dist: mkdocs<2,>=1.4.0; extra == 'docs'
41
+ Provides-Extra: security
42
+ Requires-Dist: cryptography<52,>=41.0.0; extra == 'security'
43
+ Provides-Extra: test
44
+ Requires-Dist: pytest-asyncio<2,>=0.21.0; extra == 'test'
45
+ Requires-Dist: pytest-cov<8,>=4.0.0; extra == 'test'
46
+ Requires-Dist: pytest-mock<4,>=3.10.0; extra == 'test'
47
+ Requires-Dist: pytest<10,>=8.0.0; extra == 'test'
48
+ Provides-Extra: web
49
+ Requires-Dist: quadkit-web[granian]>=0.0.2; extra == 'web'
50
+ Description-Content-Type: text/markdown
51
+
52
+ # quadkit
53
+
54
+ ![Quadkit](https://raw.githubusercontent.com/dbtinoy-/quadkit/main/banner.jpg)
55
+
56
+ [![PyPI](https://img.shields.io/pypi/v/quadkit?color=%2322c55e&label=pypi)](https://pypi.org/project/quadkit/)
57
+ [![Python](https://img.shields.io/pypi/pyversions/quadkit?color=%2322c55e)](https://pypi.org/project/quadkit/)
58
+ [![License](https://img.shields.io/pypi/l/quadkit?color=%2322c55e)](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
59
+
60
+ Async-first application framework for Python: dependency-injection
61
+ container, application lifecycle, typed configuration, and the `Result`
62
+ error model. This is the core package; everything else published from
63
+ this repository builds on it.
64
+
65
+ For application developers — write providers and modules, bind
66
+ contracts, and let one container boot them in order.
67
+
68
+ What's in the box:
69
+
70
+ - **DI container** — singleton, scoped, and transient bindings, async
71
+ factories, override support for tests; the graph resolves once, at
72
+ boot.
73
+ - **Provider & module system** — providers register bindings, boot
74
+ resources, and shut them down in reverse order; modules compose
75
+ providers into reusable units.
76
+ - **Typed configuration** — `application.yaml` validated against
77
+ dataclass models at boot (unknown keys fail fast), every key
78
+ overridable via `QK_*` environment variables, profiles via `QK_PROFILE`.
79
+ - **The `Result` model** — expected failures are values
80
+ (`Ok`/`Err`), not exceptions; `ResultPipeline` chains them fluently
81
+ while keeping the error type visible to mypy.
82
+ - **Structured logging** — `get_logger()` gives every service a
83
+ keyed, structlog-style logger out of the box.
84
+ - **Domain primitives** — `AggregateRoot`, `Entity`, `DomainEvent`,
85
+ `AbstractUnitOfWork` for DDD-style modelling without a framework
86
+ tax.
87
+
88
+ ## The quadkit family
89
+
90
+ | Package | Role |
91
+ | --- | --- |
92
+ | [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
93
+ | [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
94
+ | [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
95
+ | [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
96
+ | [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
97
+
98
+ ## Installation
99
+
100
+ ```bash
101
+ uv add quadkit
102
+ # batteries-included web stack:
103
+ uv add "quadkit[web]"
104
+ ```
105
+
106
+ Requires **Python >= 3.11**.
107
+
108
+ ## Minimal working example
109
+
110
+ ```python
111
+ import asyncio
112
+
113
+ from quadkit import Application
114
+ from quadkit.contracts.core.di import ContainerRegistrarProtocol
115
+ from quadkit.di.provider import Provider
116
+
117
+
118
+ class Settings:
119
+ greeting = "hello, quadkit"
120
+
121
+
122
+ class SettingsProvider(Provider):
123
+ async def register(self, container: ContainerRegistrarProtocol) -> None:
124
+ container.singleton(Settings, instance=Settings())
125
+
126
+
127
+ async def main() -> None:
128
+ app = Application()
129
+ app.add_provider(SettingsProvider())
130
+ await app.start()
131
+ try:
132
+ settings = await app.container.resolve(Settings)
133
+ print(settings.greeting)
134
+ finally:
135
+ await app.stop()
136
+
137
+
138
+ asyncio.run(main())
139
+ ```
140
+
141
+ For the web quickstart (a real endpoint in minutes), see
142
+ [the docs](https://dbtinoy-.github.io/quadkit/getting-started/first-app/).
143
+
144
+ ## Expected failures are values
145
+
146
+ `Result[T, E]` keeps the happy path and the failure path in the type
147
+ system — `pipeline()` chains fallible steps without `try/except`
148
+ pyramids, and `mypy` sees the error type at every step:
149
+
150
+ ```python
151
+ from quadkit.result import Err, Ok, pipeline
152
+
153
+
154
+ def parse_port(raw: str):
155
+ try:
156
+ port = int(raw)
157
+ except ValueError as exc:
158
+ return Err(exc)
159
+ if not 1 <= port <= 65535:
160
+ return Err(ValueError(f"port out of range: {port}"))
161
+ return Ok(port)
162
+
163
+
164
+ result = (
165
+ pipeline("8080") # infallible start
166
+ .then(parse_port) # Result[int, ValueError]
167
+ .map(lambda port: f"listening on :{port}")
168
+ .finalize() # Result[str, ValueError]
169
+ )
170
+ ```
171
+
172
+ In controllers, returning an `Err` renders as an RFC 7807 problem
173
+ response automatically — see the
174
+ [error-handling guide](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
175
+
176
+ ## Optional extras
177
+
178
+ | Extra | Contents |
179
+ | --- | --- |
180
+ | `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
181
+ | `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
182
+ | `quadkit[security]` | `cryptography` (signing/token helpers) |
183
+ | `quadkit[codegen]` | code generation toolchain |
184
+ | `quadkit[docs]` / `[dev]` | documentation / development tooling |
185
+
186
+ ## Public API entry points
187
+
188
+ ```python
189
+ from quadkit import Application, Result, Ok, Err
190
+ from quadkit.di.provider import Provider
191
+ from quadkit.di.container import Container
192
+ from quadkit.config import BaseConfig, ConfigLoader
193
+ from quadkit.logging import get_logger
194
+ from quadkit.domain import AggregateRoot, Entity, DomainEvent, AbstractUnitOfWork
195
+ from quadkit.contracts.core.di import (
196
+ ContainerRegistrarProtocol,
197
+ ContainerResolverProtocol,
198
+ )
199
+ ```
200
+
201
+ Providers can also define an async `boot()` (acquire resources) and
202
+ `shutdown()` (release them, in reverse registration order) — the
203
+ container drives the whole lifecycle.
204
+
205
+ Concepts: [contracts](https://dbtinoy-.github.io/quadkit/concepts/contracts/) ·
206
+ [dependency injection](https://dbtinoy-.github.io/quadkit/concepts/dependency-injection/) ·
207
+ [modules](https://dbtinoy-.github.io/quadkit/concepts/modules/) ·
208
+ [lifecycle](https://dbtinoy-.github.io/quadkit/concepts/lifecycle/) ·
209
+ [async model](https://dbtinoy-.github.io/quadkit/concepts/async-model/).
210
+
211
+ ## Configuration
212
+
213
+ `application.yaml` at the working directory, validated against typed
214
+ config models at boot (unknown keys fail fast); application metadata
215
+ lives at the root (`name`, `version`, `description`); every typed key
216
+ overrides from the environment with `QK_<SECTION>__<KEY>`. Use
217
+ `QK_PROFILE` to select a profile.
218
+
219
+ ```bash
220
+ QK_QUADKIT__LOGGING__LEVEL=DEBUG # fold into the root `logging` section
221
+ QK_PROFILE=production # select a profile block
222
+ ```
223
+
224
+ See
225
+ [configuration](https://dbtinoy-.github.io/quadkit/getting-started/configuration/).
226
+
227
+ ## Error handling
228
+
229
+ `Result[T, E]` for expected domain failures; the
230
+ `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
231
+ NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
232
+ else. The web layer renders both as problem responses — see
233
+ [error handling](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
234
+
235
+ ## Testing
236
+
237
+ Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
238
+ your application in-process (with `overrides={Contract: fake}` for test
239
+ doubles), no server required. See
240
+ [testing](https://dbtinoy-.github.io/quadkit/getting-started/testing/).
241
+
242
+ ## Security
243
+
244
+ Never put secrets in `application.yaml` — pass them through `QK_*`
245
+ environment variables or a secret store. Unexpected exceptions never
246
+ leak internals to clients. See
247
+ [secure configuration](https://dbtinoy-.github.io/quadkit/security/secure-configuration/) and
248
+ report vulnerabilities privately per
249
+ [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
250
+
251
+ ## Stability
252
+
253
+ Version `0.0.3` in the `0.x` series, released in lockstep with the
254
+ other four distributions; APIs may change between minor versions until
255
+ 1.0 — pin an exact version
256
+ (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
257
+ [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
258
+
259
+ ## Links
260
+
261
+ - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
262
+ - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
263
+ - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
264
+ - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
265
+ - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
266
+ - **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
267
+
268
+ Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
269
+ Quadkit logo are trademarks of the project — see
270
+ [TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).
@@ -0,0 +1,219 @@
1
+ # quadkit
2
+
3
+ ![Quadkit](https://raw.githubusercontent.com/dbtinoy-/quadkit/main/banner.jpg)
4
+
5
+ [![PyPI](https://img.shields.io/pypi/v/quadkit?color=%2322c55e&label=pypi)](https://pypi.org/project/quadkit/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/quadkit?color=%2322c55e)](https://pypi.org/project/quadkit/)
7
+ [![License](https://img.shields.io/pypi/l/quadkit?color=%2322c55e)](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE)
8
+
9
+ Async-first application framework for Python: dependency-injection
10
+ container, application lifecycle, typed configuration, and the `Result`
11
+ error model. This is the core package; everything else published from
12
+ this repository builds on it.
13
+
14
+ For application developers — write providers and modules, bind
15
+ contracts, and let one container boot them in order.
16
+
17
+ What's in the box:
18
+
19
+ - **DI container** — singleton, scoped, and transient bindings, async
20
+ factories, override support for tests; the graph resolves once, at
21
+ boot.
22
+ - **Provider & module system** — providers register bindings, boot
23
+ resources, and shut them down in reverse order; modules compose
24
+ providers into reusable units.
25
+ - **Typed configuration** — `application.yaml` validated against
26
+ dataclass models at boot (unknown keys fail fast), every key
27
+ overridable via `QK_*` environment variables, profiles via `QK_PROFILE`.
28
+ - **The `Result` model** — expected failures are values
29
+ (`Ok`/`Err`), not exceptions; `ResultPipeline` chains them fluently
30
+ while keeping the error type visible to mypy.
31
+ - **Structured logging** — `get_logger()` gives every service a
32
+ keyed, structlog-style logger out of the box.
33
+ - **Domain primitives** — `AggregateRoot`, `Entity`, `DomainEvent`,
34
+ `AbstractUnitOfWork` for DDD-style modelling without a framework
35
+ tax.
36
+
37
+ ## The quadkit family
38
+
39
+ | Package | Role |
40
+ | --- | --- |
41
+ | [`quadkit-contracts`](https://pypi.org/project/quadkit-contracts/) | zero-dependency protocols, types, exception hierarchy |
42
+ | [`quadkit`](https://pypi.org/project/quadkit/) | the framework core — DI container, modules, config, logging, `Result` |
43
+ | [`quadkit-web`](https://pypi.org/project/quadkit-web/) | ASGI layer — controllers, routing, middleware, OpenAPI docs |
44
+ | [`quadkit-cli`](https://pypi.org/project/quadkit-cli/) | project scaffolding and code generators |
45
+ | [`quadkit-testing`](https://pypi.org/project/quadkit-testing/) | in-process test beds, fakes, fixtures |
46
+
47
+ ## Installation
48
+
49
+ ```bash
50
+ uv add quadkit
51
+ # batteries-included web stack:
52
+ uv add "quadkit[web]"
53
+ ```
54
+
55
+ Requires **Python >= 3.11**.
56
+
57
+ ## Minimal working example
58
+
59
+ ```python
60
+ import asyncio
61
+
62
+ from quadkit import Application
63
+ from quadkit.contracts.core.di import ContainerRegistrarProtocol
64
+ from quadkit.di.provider import Provider
65
+
66
+
67
+ class Settings:
68
+ greeting = "hello, quadkit"
69
+
70
+
71
+ class SettingsProvider(Provider):
72
+ async def register(self, container: ContainerRegistrarProtocol) -> None:
73
+ container.singleton(Settings, instance=Settings())
74
+
75
+
76
+ async def main() -> None:
77
+ app = Application()
78
+ app.add_provider(SettingsProvider())
79
+ await app.start()
80
+ try:
81
+ settings = await app.container.resolve(Settings)
82
+ print(settings.greeting)
83
+ finally:
84
+ await app.stop()
85
+
86
+
87
+ asyncio.run(main())
88
+ ```
89
+
90
+ For the web quickstart (a real endpoint in minutes), see
91
+ [the docs](https://dbtinoy-.github.io/quadkit/getting-started/first-app/).
92
+
93
+ ## Expected failures are values
94
+
95
+ `Result[T, E]` keeps the happy path and the failure path in the type
96
+ system — `pipeline()` chains fallible steps without `try/except`
97
+ pyramids, and `mypy` sees the error type at every step:
98
+
99
+ ```python
100
+ from quadkit.result import Err, Ok, pipeline
101
+
102
+
103
+ def parse_port(raw: str):
104
+ try:
105
+ port = int(raw)
106
+ except ValueError as exc:
107
+ return Err(exc)
108
+ if not 1 <= port <= 65535:
109
+ return Err(ValueError(f"port out of range: {port}"))
110
+ return Ok(port)
111
+
112
+
113
+ result = (
114
+ pipeline("8080") # infallible start
115
+ .then(parse_port) # Result[int, ValueError]
116
+ .map(lambda port: f"listening on :{port}")
117
+ .finalize() # Result[str, ValueError]
118
+ )
119
+ ```
120
+
121
+ In controllers, returning an `Err` renders as an RFC 7807 problem
122
+ response automatically — see the
123
+ [error-handling guide](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
124
+
125
+ ## Optional extras
126
+
127
+ | Extra | Contents |
128
+ | --- | --- |
129
+ | `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
130
+ | `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
131
+ | `quadkit[security]` | `cryptography` (signing/token helpers) |
132
+ | `quadkit[codegen]` | code generation toolchain |
133
+ | `quadkit[docs]` / `[dev]` | documentation / development tooling |
134
+
135
+ ## Public API entry points
136
+
137
+ ```python
138
+ from quadkit import Application, Result, Ok, Err
139
+ from quadkit.di.provider import Provider
140
+ from quadkit.di.container import Container
141
+ from quadkit.config import BaseConfig, ConfigLoader
142
+ from quadkit.logging import get_logger
143
+ from quadkit.domain import AggregateRoot, Entity, DomainEvent, AbstractUnitOfWork
144
+ from quadkit.contracts.core.di import (
145
+ ContainerRegistrarProtocol,
146
+ ContainerResolverProtocol,
147
+ )
148
+ ```
149
+
150
+ Providers can also define an async `boot()` (acquire resources) and
151
+ `shutdown()` (release them, in reverse registration order) — the
152
+ container drives the whole lifecycle.
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/).
159
+
160
+ ## Configuration
161
+
162
+ `application.yaml` at the working directory, validated against typed
163
+ config models at boot (unknown keys fail fast); application metadata
164
+ lives at the root (`name`, `version`, `description`); every typed key
165
+ overrides from the environment with `QK_<SECTION>__<KEY>`. Use
166
+ `QK_PROFILE` to select a profile.
167
+
168
+ ```bash
169
+ QK_QUADKIT__LOGGING__LEVEL=DEBUG # fold into the root `logging` section
170
+ QK_PROFILE=production # select a profile block
171
+ ```
172
+
173
+ See
174
+ [configuration](https://dbtinoy-.github.io/quadkit/getting-started/configuration/).
175
+
176
+ ## Error handling
177
+
178
+ `Result[T, E]` for expected domain failures; the
179
+ `quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
180
+ NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
181
+ else. The web layer renders both as problem responses — see
182
+ [error handling](https://dbtinoy-.github.io/quadkit/guides/error-handling/).
183
+
184
+ ## Testing
185
+
186
+ Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
187
+ your application in-process (with `overrides={Contract: fake}` for test
188
+ doubles), no server required. See
189
+ [testing](https://dbtinoy-.github.io/quadkit/getting-started/testing/).
190
+
191
+ ## Security
192
+
193
+ Never put secrets in `application.yaml` — pass them through `QK_*`
194
+ environment variables or a secret store. Unexpected exceptions never
195
+ leak internals to clients. See
196
+ [secure configuration](https://dbtinoy-.github.io/quadkit/security/secure-configuration/) and
197
+ report vulnerabilities privately per
198
+ [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
199
+
200
+ ## Stability
201
+
202
+ Version `0.0.3` in the `0.x` series, released in lockstep with the
203
+ other four distributions; APIs may change between minor versions until
204
+ 1.0 — pin an exact version
205
+ (`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
206
+ [stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
207
+
208
+ ## Links
209
+
210
+ - **Documentation** — <https://dbtinoy-.github.io/quadkit/>
211
+ - **Getting started** — <https://dbtinoy-.github.io/quadkit/getting-started/installation/>
212
+ - **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
213
+ - **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
214
+ - **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
215
+ - **Contributing** — [CONTRIBUTING.md](https://github.com/dbtinoy-/quadkit/blob/main/CONTRIBUTING.md)
216
+
217
+ Apache-2.0 — see [LICENSE](https://github.com/dbtinoy-/quadkit/blob/main/LICENSE). "Quadkit" and the
218
+ Quadkit logo are trademarks of the project — see
219
+ [TRADEMARK.md](https://github.com/dbtinoy-/quadkit/blob/main/TRADEMARK.md).