quadkit 0.0.3__tar.gz → 0.0.41__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.
- quadkit-0.0.41/PKG-INFO +270 -0
- quadkit-0.0.41/README.md +219 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/example.yaml +0 -17
- {quadkit-0.0.3 → quadkit-0.0.41}/pyproject.toml +16 -18
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/config.py +0 -15
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/constants.py +0 -4
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/executors/dispatcher.py +5 -4
- quadkit-0.0.41/src/quadkit/di/container/container.py +281 -0
- quadkit-0.0.41/src/quadkit/di/container/container_resolution.py +292 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/collect.py +2 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/errors.py +6 -4
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/__init__.py +0 -5
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/factory.py +2 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/redaction.py +11 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/__init__.py +0 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/caching.py +3 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/routing.py +5 -2
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/validation.py +5 -3
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/config.py +2 -15
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/constants.py +0 -4
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/config.py +1 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/sanitization/sanitizer.py +27 -8
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_config.py +0 -6
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_constants.py +0 -5
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -4
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_config_pool.py +0 -15
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_container_visibility.py +38 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_di_provider_config_wiring.py +1 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_constants.py +0 -7
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_constants_new.py +0 -4
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_security_components_p2.py +3 -3
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_base_and_misc_exceptions.py +2 -1
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_concurrency_constants.py +3 -13
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_redaction.py +79 -5
- quadkit-0.0.3/CHANGELOG.md +0 -73
- quadkit-0.0.3/PKG-INFO +0 -179
- quadkit-0.0.3/README.md +0 -128
- quadkit-0.0.3/src/quadkit/di/container/container.py +0 -526
- quadkit-0.0.3/src/quadkit/domain/config.py +0 -38
- quadkit-0.0.3/src/quadkit/security/protocols.py +0 -15
- {quadkit-0.0.3 → quadkit-0.0.41}/.gitignore +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/LICENSE +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/NOTICE +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/import_error.txt +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/asgi_lifespan.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/config/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/config/discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/config/models.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/config_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/events.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/factory.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/health_probes.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/injectable_provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/invoker.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/runner.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/secrets.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/standard.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/app/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/codegen/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/codegen/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/bridges/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/bridges/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/channels/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/channels/channel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/channels/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/di/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/executors/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/executors/parallel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/executors/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/executors/task_manager.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/locks/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/locks/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/locks/rwlock.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/concurrency/task_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/merge.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/sources.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/lib/watcher.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/main.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/secrets.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/config/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/_graph.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/builder.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/config/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/config/models.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/container_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/container_runtime.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/registrar.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/resolver.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/scope.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/container/validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/context.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/decorators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/interceptors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/strategies.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/extensions/validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/function_provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/integration/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/integration/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/markers.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/compiler.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/context.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/order.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/dynamic.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/graph.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/metadata.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/module/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/events.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/health.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/orchestrator/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/provider_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/context.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/descriptor.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/diagnostics.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/injector.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/invoker.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/resolver.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/store.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/type_hints.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/resolution/validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/di/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/aggregate.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/coercion.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/entity.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/factory.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/models/value_object.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/domain/unit_of_work.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/hooks/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/hooks/ambient.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/hooks/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/hooks/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/ambient.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/identity/generator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/README.md +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/config/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/config/models.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/config/redaction.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/config/sampling.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/configurator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/debug.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/processors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/logging/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/core/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/core/mapper.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/mapping/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/di.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/observability.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/builtins/resilience.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/core/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/core/chain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/core/exception_filters.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/core/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/middleware/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/observability/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/observability/core.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/observability/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/engine.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/plugins/state.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/builder.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/clock.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/context.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/context_keys.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/context_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/data.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/lazy.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/registry/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/registry/core.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/registry/introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/trusted_html.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/primitives/typing.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/core.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/operators/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/operators/control.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/operators/time_ops.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/operators/transform.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/retry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/reactive/subjects.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/result/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/result/_pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/result/errors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/result/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/result/utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/saga/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/saga/base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/saga/canonical_json.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/saga/content_addressed.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/decorators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/encryption/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/encryption/service.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/events.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/guards/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/guards/chain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/guards/decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/hashing/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/hashing/ambient.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/hashing/digest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/hashing/kdf.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/hooks.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/sanitization/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/sanitization/filename.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/sanitization/html.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/sanitization/url.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/secrets/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/secrets/rotation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/secrets/store.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/secrets/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/security/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/backends/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/backends/json.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/backends/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/di/provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/di/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/domain/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/domain/domain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/domain/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/registry/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/registry/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/registry/registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/schema/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/schema/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/schema/schema.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/serialization/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/decorators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/engine/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/engine/coercion.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/engine/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/engine/validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/rules/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/rules/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/rules/rules.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/schema/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/schema/fields.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/schema/introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/schema/py.typed +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/src/quadkit/validation/types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/_fixtures.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_boot_level.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_cross_method.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_dependency_chain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_exports.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_importers.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_module_health_integration.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_name_lookup.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/integration/test_full_pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/test.md +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/test_import_diagnostic.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/aop/test_interceptor_timeout.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/clock/test_clock.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/codegen/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/codegen/test_generator_base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/codegen/test_staged_generation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/codegen/test_template_overrides.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_bounded_channel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_channel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_dispatcher.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_sync_bridge.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_task_manager.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/concurrency/test_task_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_config_constants_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_config_protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_config_sources.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_env_interpolation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_loader_fail_fast.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_logging_redaction_config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_logging_sampling.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_profile_overlay.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_scoping.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_secrets_validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_strict_bool_env.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/config/test_strict_sections.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/test_context_correlation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/test_core_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/test_core_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/test_request_context_di.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/test_typing.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/core/validation/test_protocols.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/integration/test_provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_compiler.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_dynamic.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_errors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_global.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_graph_reflection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_health_graph.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_integration.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_module_lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_reexport.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_stub_compiler.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_stub_decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/module/test_visibility.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_advanced_features.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_container_basics.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_container_builder.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_container_freeze.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_container_hardening.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_decorators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_descriptor.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_di_constants_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_di_decorators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_diagnostics.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_extensions_discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_extensions_validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_function_provider_boot.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_graph_validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_interceptor_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_invoker_unit.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_module_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_module_visibility_boot.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_named_binding.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_orchestrator_health.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_basics.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_config_injection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_conformance.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_orchestration.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_reset_state.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_provider_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_scope_concurrency.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_scope_manager.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_service_store.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_type_hints.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/di/test_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_aggregates.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain_init.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain_model_strict.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_domain_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_models_factory.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/domain/test_value_object.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/identity/test_identity.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/logging/test_logging_constants_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_auto_map.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_mapping_mapper.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_mapping_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_mapping_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_protocol.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/mapping/test_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_builtins.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_chain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_config_alignment.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_exception_filters.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_chain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_routing.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_middleware_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_registry_defaults.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/plugins/test_discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/plugins/test_engine.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/plugins/test_state.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/plugins/test_state_hardening.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/plugins/test_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/primitives/test_primitives_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/primitives/test_registry_advanced.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/primitives/test_registry_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/primitives/test_trusted_html.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_control.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_core.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_facade.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_retry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_subjects.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_time_ops.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/reactive/test_transform.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_guards.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_hashing.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_package_hooks_p2.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_secret_rotation_policy.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_secrets_rotation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_secrets_store.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_security_api.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_security_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_security_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/security/test_security_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_schema.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_domain.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_init.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_json.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/serialization/test_serialization_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_boot_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_config_and_misc.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_discovery.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_health_baseline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_health_config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_runner_and_lifespan.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_app_validation_and_misc.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_application.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_application_base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_application_lifecycle.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_codegen.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_compiler_graph_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_component_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_hardening.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_quadkit.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_requirements.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_sources.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_config_watcher.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_container_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_container_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_container_override.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_container_resolver_impl.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_container_runtime_mixin.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_context_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_contract_completeness.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_core_builder.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_core_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_core_lazy.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_core_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_core_pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_dependency_injector.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_di_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_di_descriptor.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_di_module_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_domain_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_domain_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_domain_model_base.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_dynamic_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_events_security_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_execution_result.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_hatch_build_targets.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_health_probes.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_hook_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_hook_registry_edge_cases.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_hook_registry_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_hook_registry_scenarios.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_identity_generators_and_ambient.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_infra_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_input_sanitizers.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_interceptors.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_json_serialization_backend.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_apply_redaction.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_bridging.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_debug.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_di_provider.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_factory.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_init.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_redaction_compound.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_logging_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_m13_m14_verification.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_mapper.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_mapper_enhanced.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_mapping.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_middleware_enhancements.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_middleware_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_module_decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_module_scan_and_provide.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_module_system.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_no_db_imports.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_observability.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_orchestrator_parallel.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_p2_scope_log_level.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_primitives_context.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_primitives_data.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_primitives_registry.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_provider_boot_enhanced.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_provider_decorator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_quadkit_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_quadkit_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_repr_helpers.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_resilience_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_combinators.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_core.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_pipeline.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_pipeline_and_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_types_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_result_utils.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_round22_hardening.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_round41_hardening.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_saga_primitives.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_sampling_and_config.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_secret_stores_and_rotation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_serialization_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_serialization_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_service_descriptor.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_structured_logging.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_time_ops.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_validation_coercion.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_validation_exceptions.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_validation_rules.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/test_validation_validator_engine.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/__init__.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/conftest.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_async_validator.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_coercion.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_helpers.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_constants.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_constants_new.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_fields.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_fields_extended.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_init.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_introspection.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_module.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validation_types.py +0 -0
- {quadkit-0.0.3 → quadkit-0.0.41}/tests/unit/validation/test_validator.py +0 -0
quadkit-0.0.41/PKG-INFO
ADDED
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: quadkit
|
|
3
|
+
Version: 0.0.41
|
|
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
|
+

|
|
55
|
+
|
|
56
|
+
[](https://pypi.org/project/quadkit/)
|
|
57
|
+
[](https://pypi.org/project/quadkit/)
|
|
58
|
+
[](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).
|
quadkit-0.0.41/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# quadkit
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
[](https://pypi.org/project/quadkit/)
|
|
6
|
+
[](https://pypi.org/project/quadkit/)
|
|
7
|
+
[](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).
|
|
@@ -119,9 +119,6 @@ concurrency:
|
|
|
119
119
|
# Default capacity for BoundedChannel instances.
|
|
120
120
|
default_channel_capacity: 100
|
|
121
121
|
|
|
122
|
-
# Default semaphore acquisition timeout (seconds).
|
|
123
|
-
default_semaphore_timeout: 30.0
|
|
124
|
-
|
|
125
122
|
# Number of worker threads for the thread pool executor.
|
|
126
123
|
worker_threads: 4
|
|
127
124
|
|
|
@@ -132,8 +129,6 @@ concurrency:
|
|
|
132
129
|
dispatcher:
|
|
133
130
|
max_concurrent_tasks: 100
|
|
134
131
|
queue_timeout: 30.0
|
|
135
|
-
retry_failed_tasks: true
|
|
136
|
-
max_retries: 3
|
|
137
132
|
|
|
138
133
|
pool:
|
|
139
134
|
min_size: 1
|
|
@@ -185,9 +180,6 @@ middleware:
|
|
|
185
180
|
default_retry_count: 3
|
|
186
181
|
default_retry_delay: 1.0
|
|
187
182
|
|
|
188
|
-
# HTTP header for correlation ID propagation.
|
|
189
|
-
correlation_header: "X-Correlation-ID"
|
|
190
|
-
|
|
191
183
|
# Default timeout for TimeoutMiddleware (seconds).
|
|
192
184
|
default_timeout: 30.0
|
|
193
185
|
|
|
@@ -203,15 +195,6 @@ middleware:
|
|
|
203
195
|
# Rate limiter: window duration in seconds.
|
|
204
196
|
rate_limit_window: 60.0
|
|
205
197
|
|
|
206
|
-
# -- Domain ----------------------------------------------------------------
|
|
207
|
-
|
|
208
|
-
domain:
|
|
209
|
-
# Raise at runtime when code mutates a frozen ValueObject.
|
|
210
|
-
strict_immutability: false
|
|
211
|
-
|
|
212
|
-
# Prefix prepended to auto-generated entity IDs (deprecated -- use identity.prefix_map).
|
|
213
|
-
id_prefix: ""
|
|
214
|
-
|
|
215
198
|
# -- Mapping ---------------------------------------------------------------
|
|
216
199
|
|
|
217
200
|
mapping:
|
|
@@ -27,7 +27,7 @@ build-backend = "hatchling.build"
|
|
|
27
27
|
|
|
28
28
|
[project]
|
|
29
29
|
name = "quadkit"
|
|
30
|
-
version = "0.0.
|
|
30
|
+
version = "0.0.41"
|
|
31
31
|
description = "Async-first DI/IoC framework for Python — core package"
|
|
32
32
|
readme = "README.md"
|
|
33
33
|
requires-python = ">=3.11"
|
|
@@ -68,9 +68,9 @@ maintainers = [
|
|
|
68
68
|
|
|
69
69
|
dependencies = [
|
|
70
70
|
"quadkit-contracts>=0.0.2",
|
|
71
|
-
"orjson>=3.0.0",
|
|
71
|
+
"orjson>=3.0.0,<4",
|
|
72
72
|
"structlog>=25.1.0,<27", # Structured logging foundation
|
|
73
|
-
"pydantic>=2.10.0", # Required: used unconditionally by config, validation
|
|
73
|
+
"pydantic>=2.10.0,<3", # Required: used unconditionally by config, validation
|
|
74
74
|
]
|
|
75
75
|
|
|
76
76
|
# =============================================================================
|
|
@@ -85,33 +85,33 @@ dependencies = [
|
|
|
85
85
|
# ── Development ────────────────────────────────────────────────────────
|
|
86
86
|
|
|
87
87
|
dev = [
|
|
88
|
-
"ruff>=0.16.4",
|
|
89
|
-
"mypy>=1.0.0",
|
|
90
|
-
"pre-commit>=3.0.0",
|
|
88
|
+
"ruff>=0.16.4,<1",
|
|
89
|
+
"mypy>=1.0.0,<3",
|
|
90
|
+
"pre-commit>=3.0.0,<5",
|
|
91
91
|
]
|
|
92
92
|
|
|
93
93
|
# Codegen extra — opt-in template engine for quadkit.codegen scaffolders.
|
|
94
94
|
# The base classes import jinja2 lazily; only template rendering needs it.
|
|
95
95
|
codegen = [
|
|
96
|
-
"jinja2>=3.1.0",
|
|
96
|
+
"jinja2>=3.1.0,<4",
|
|
97
97
|
]
|
|
98
98
|
|
|
99
99
|
test = [
|
|
100
|
-
"pytest>=8.0.0",
|
|
101
|
-
"pytest-asyncio>=0.21.0",
|
|
102
|
-
"pytest-cov>=4.0.0",
|
|
103
|
-
"pytest-mock>=3.10.0",
|
|
100
|
+
"pytest>=8.0.0,<10",
|
|
101
|
+
"pytest-asyncio>=0.21.0,<2",
|
|
102
|
+
"pytest-cov>=4.0.0,<8",
|
|
103
|
+
"pytest-mock>=3.10.0,<4",
|
|
104
104
|
]
|
|
105
105
|
|
|
106
106
|
docs = [
|
|
107
|
-
"mkdocs>=1.4.0",
|
|
108
|
-
"mkdocs-material>=9.0.0",
|
|
107
|
+
"mkdocs>=1.4.0,<2",
|
|
108
|
+
"mkdocs-material>=9.0.0,<10",
|
|
109
109
|
]
|
|
110
110
|
|
|
111
111
|
# Security extras — opt-in deps for quadkit.security.* implementations
|
|
112
112
|
# Encryption requires cryptography.
|
|
113
113
|
security = [
|
|
114
|
-
"cryptography>=41.0.0",
|
|
114
|
+
"cryptography>=41.0.0,<52",
|
|
115
115
|
]
|
|
116
116
|
|
|
117
117
|
# ── Extension Convenience Groups ──────────────────────────────────────
|
|
@@ -135,9 +135,9 @@ web = [
|
|
|
135
135
|
# =============================================================================
|
|
136
136
|
|
|
137
137
|
[project.urls]
|
|
138
|
-
Homepage = "https://quadkit
|
|
138
|
+
Homepage = "https://dbtinoy-.github.io/quadkit/"
|
|
139
139
|
Repository = "https://github.com/dbtinoy-/quadkit"
|
|
140
|
-
Documentation = "https://quadkit
|
|
140
|
+
Documentation = "https://dbtinoy-.github.io/quadkit/"
|
|
141
141
|
Issues = "https://github.com/dbtinoy-/quadkit/issues"
|
|
142
142
|
Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
|
|
143
143
|
|
|
@@ -283,5 +283,3 @@ show_missing = true
|
|
|
283
283
|
|
|
284
284
|
[tool.uv.sources]
|
|
285
285
|
quadkit-contracts = { workspace = true }
|
|
286
|
-
|
|
287
|
-
|
|
@@ -13,7 +13,6 @@ from dataclasses import dataclass, field
|
|
|
13
13
|
from quadkit.concurrency.constants import (
|
|
14
14
|
DEFAULT_CHANNEL_CAPACITY,
|
|
15
15
|
DEFAULT_DISPATCHER_SHUTDOWN_TIMEOUT,
|
|
16
|
-
DEFAULT_SEMAPHORE_TIMEOUT,
|
|
17
16
|
DEFAULT_WORKER_THREADS,
|
|
18
17
|
)
|
|
19
18
|
|
|
@@ -98,11 +97,6 @@ class DispatcherConfig:
|
|
|
98
97
|
Attributes:
|
|
99
98
|
max_concurrent_tasks: Maximum number of concurrent tasks (>= 1).
|
|
100
99
|
queue_timeout: Queue timeout in seconds (>= 0).
|
|
101
|
-
retry_failed_tasks: Reserved: DispatcherImpl propagates task
|
|
102
|
-
exceptions today (retrying non-idempotent tasks silently would be
|
|
103
|
-
unsafe); will gate automatic retries when implemented.
|
|
104
|
-
max_retries: Maximum number of retries (>= 0); only meaningful
|
|
105
|
-
together with retry_failed_tasks (see above).
|
|
106
100
|
pool: Worker pool configuration.
|
|
107
101
|
cpu_pool: CPU-bound thread pool configuration.
|
|
108
102
|
io_pool: I/O-bound thread pool configuration.
|
|
@@ -110,8 +104,6 @@ class DispatcherConfig:
|
|
|
110
104
|
|
|
111
105
|
max_concurrent_tasks: int = 100
|
|
112
106
|
queue_timeout: float = 30.0
|
|
113
|
-
retry_failed_tasks: bool = True
|
|
114
|
-
max_retries: int = 3
|
|
115
107
|
pool: PoolConfig = field(default_factory=PoolConfig)
|
|
116
108
|
cpu_pool: ThreadPoolConfig = field(default_factory=ThreadPoolConfig)
|
|
117
109
|
io_pool: ThreadPoolConfig = field(default_factory=ThreadPoolConfig)
|
|
@@ -123,8 +115,6 @@ class DispatcherConfig:
|
|
|
123
115
|
)
|
|
124
116
|
if self.queue_timeout < 0:
|
|
125
117
|
raise ValueError(f"queue_timeout must be >= 0, got {self.queue_timeout}")
|
|
126
|
-
if self.max_retries < 0:
|
|
127
|
-
raise ValueError(f"max_retries must be >= 0, got {self.max_retries}")
|
|
128
118
|
|
|
129
119
|
def get_cpu_pool_config(self) -> ThreadPoolConfig:
|
|
130
120
|
"""Return the CPU-bound thread pool configuration.
|
|
@@ -156,11 +146,6 @@ class ConcurrencyConfig:
|
|
|
156
146
|
# consumed by: ConcurrencyProvider.boot() -> BoundedChannel.configure();
|
|
157
147
|
# channels created without an explicit capacity pick this up (explicit
|
|
158
148
|
# ``capacity=0`` still means unbounded).
|
|
159
|
-
default_semaphore_timeout: float = DEFAULT_SEMAPHORE_TIMEOUT
|
|
160
|
-
# reserved: core dispatch uses ``asyncio.Semaphore`` with no default
|
|
161
|
-
# acquisition timeout; applying one would convert unbounded waits in
|
|
162
|
-
# saturated batch workloads into timeouts. Wire when a dedicated
|
|
163
|
-
# Semaphore primitive lands.
|
|
164
149
|
worker_threads: int = DEFAULT_WORKER_THREADS
|
|
165
150
|
# consumed by: thread pool executor in ConcurrencyProvider.register()
|
|
166
151
|
dispatcher_shutdown_timeout: float = DEFAULT_DISPATCHER_SHUTDOWN_TIMEOUT
|
|
@@ -25,9 +25,6 @@ ENV_NESTED_DELIMITER: str = "__"
|
|
|
25
25
|
DEFAULT_CHANNEL_CAPACITY: int = 100
|
|
26
26
|
"""Default bounded-channel buffer size; consumed by: Channel.__init__."""
|
|
27
27
|
|
|
28
|
-
DEFAULT_SEMAPHORE_TIMEOUT: float = 30.0
|
|
29
|
-
"""Default semaphore acquisition timeout in seconds; consumed by: Semaphore default."""
|
|
30
|
-
|
|
31
28
|
DEFAULT_WORKER_THREADS: int = 4
|
|
32
29
|
"""Default thread-pool size; consumed by: thread pool executor in Dispatcher."""
|
|
33
30
|
|
|
@@ -37,7 +34,6 @@ DEFAULT_DISPATCHER_SHUTDOWN_TIMEOUT: float = 10.0
|
|
|
37
34
|
__all__ = [
|
|
38
35
|
"DEFAULT_CHANNEL_CAPACITY",
|
|
39
36
|
"DEFAULT_DISPATCHER_SHUTDOWN_TIMEOUT",
|
|
40
|
-
"DEFAULT_SEMAPHORE_TIMEOUT",
|
|
41
37
|
"DEFAULT_WORKER_THREADS",
|
|
42
38
|
"ENV_NESTED_DELIMITER",
|
|
43
39
|
"ENV_PREFIX",
|