quadkit 0.0.2__tar.gz → 0.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- quadkit-0.0.3/.gitignore +24 -0
- quadkit-0.0.3/PKG-INFO +179 -0
- quadkit-0.0.3/README.md +128 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/example.yaml +2 -2
- {quadkit-0.0.2 → quadkit-0.0.3}/pyproject.toml +3 -5
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/base.py +3 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/health_probes.py +32 -6
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/module.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/base.py +3 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container.py +52 -21
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/registrar.py +26 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/decorators.py +7 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/discovery.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/function_provider.py +16 -7
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/lifecycle.py +20 -5
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/registry.py +17 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/resolver.py +5 -3
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/unit_of_work.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/configurator.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/processors.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/resilience.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/core.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context_registry.py +15 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/pipeline.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/introspection.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_generator_base.py +3 -33
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_template_overrides.py +3 -3
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_exceptions.py +7 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_env_interpolation.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_logging_sampling.py +13 -11
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_secrets_validator.py +1 -1
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_strict_sections.py +19 -3
- quadkit-0.0.3/tests/unit/di/test_function_provider_boot.py +68 -0
- quadkit-0.0.3/tests/unit/di/test_module_visibility_boot.py +116 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_config_injection.py +1 -1
- quadkit-0.0.3/tests/unit/test_app_health_baseline.py +81 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config.py +13 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_context_registry.py +26 -0
- quadkit-0.0.2/.gitignore +0 -190
- quadkit-0.0.2/PKG-INFO +0 -157
- quadkit-0.0.2/README.md +0 -106
- {quadkit-0.0.2 → quadkit-0.0.3}/CHANGELOG.md +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/LICENSE +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/NOTICE +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/import_error.txt +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/asgi_lifespan.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config/models.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/config_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/events.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/factory.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/injectable_provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/invoker.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/pipeline.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/runner.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/secrets.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/standard.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/app/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/codegen/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/codegen/base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/channel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/channels/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/di/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/parallel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/executors/task_manager.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/locks/rwlock.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/concurrency/task_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/merge.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/sources.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/lib/watcher.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/main.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/secrets.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/config/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/_graph.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/builder.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/config/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/config/models.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/container_runtime.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/resolver.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/scope.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/container/validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/context.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/interceptors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/strategies.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/extensions/validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/integration/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/integration/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/markers.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/compiler.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/context.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/collect.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/order.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/dynamic.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/errors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/graph.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/metadata.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/module/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/events.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/health.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/orchestrator/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/provider_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/context.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/descriptor.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/diagnostics.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/injector.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/invoker.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/store.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/type_hints.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/resolution/validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/di/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/aggregate.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/coercion.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/entity.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/factory.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/models/value_object.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/domain/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/ambient.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/hooks/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/ambient.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/identity/generator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/README.md +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/models.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/redaction.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/config/sampling.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/debug.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/factory.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/redaction.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/logging/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/core/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/core/mapper.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/mapping/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/caching.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/di.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/observability.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/routing.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/builtins/validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/chain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/exception_filters.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/core/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/middleware/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/engine.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/plugins/state.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/builder.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/clock.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/context_keys.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/data.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/lazy.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/registry/core.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/trusted_html.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/primitives/typing.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/core.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/control.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/time_ops.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/operators/transform.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/retry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/reactive/subjects.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/_pipeline.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/errors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/result/utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/canonical_json.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/saga/content_addressed.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/decorators.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/encryption/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/encryption/service.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/events.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/chain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/guards/decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/ambient.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/digest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hashing/kdf.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/hooks.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/filename.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/html.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/sanitizer.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/sanitization/url.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/rotation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/store.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/secrets/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/security/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/json.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/backends/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/di/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/domain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/domain/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/registry/registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/schema/schema.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/serialization/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/decorators.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/coercion.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/engine/validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/rules/rules.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/fields.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/schema/py.typed +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/src/quadkit/validation/types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/_fixtures.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_boot_level.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_cross_method.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_dependency_chain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_exports.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_importers.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_module_health_integration.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_name_lookup.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/integration/test_full_pipeline.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/test.md +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/test_import_diagnostic.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/aop/test_interceptor_timeout.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/clock/test_clock.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/codegen/test_staged_generation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_bounded_channel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_channel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_config_pool.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_dispatcher.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_sync_bridge.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_task_manager.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/concurrency/test_task_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_config_sources.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_loader_fail_fast.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_logging_redaction_config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_profile_overlay.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_scoping.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/config/test_strict_bool_env.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_context_correlation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_core_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_core_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_request_context_di.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/test_typing.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/core/validation/test_protocols.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/integration/test_provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_compiler.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_dynamic.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_errors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_global.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_graph_reflection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_health_graph.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_integration.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_module_lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_reexport.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_stub_compiler.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_stub_decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/module/test_visibility.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_advanced_features.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_basics.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_builder.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_freeze.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_hardening.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_container_visibility.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_decorators.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_descriptor.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_decorators.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_diagnostics.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_extensions_discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_extensions_validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_graph_validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_interceptor_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_invoker_unit.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_module_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_named_binding.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_orchestrator_health.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_basics.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_conformance.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_orchestration.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_reset_state.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_provider_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_scope_concurrency.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_scope_manager.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_service_store.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_type_hints.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/di/test_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_aggregates.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_init.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_model_strict.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_domain_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_models_factory.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/domain/test_value_object.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/identity/test_identity.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/logging/test_logging_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_auto_map.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_mapper.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_mapping_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_protocol.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/mapping/test_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_builtins.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_chain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_config_alignment.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_exception_filters.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_chain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_routing.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_middleware_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_registry_defaults.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_engine.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_state.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_state_hardening.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/plugins/test_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_primitives_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_registry_advanced.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_registry_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/primitives/test_trusted_html.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_control.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_core.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_facade.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_retry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_subjects.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_time_ops.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/reactive/test_transform.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_guards.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_hashing.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_package_hooks_p2.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secret_rotation_policy.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secrets_rotation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_secrets_store.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_api.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_components_p2.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/security/test_security_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_schema.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_domain.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_init.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_json.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/serialization/test_serialization_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_boot_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_config_and_misc.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_discovery.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_health_config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_runner_and_lifespan.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_app_validation_and_misc.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application_base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_application_lifecycle.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_base_and_misc_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_codegen.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_compiler_graph_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_component_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_concurrency_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_hardening.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_quadkit.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_requirements.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_sources.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_config_watcher.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_override.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_resolver_impl.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_container_runtime_mixin.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_contract_completeness.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_builder.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_lazy.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_core_pipeline.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_dependency_injector.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_descriptor.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_di_module_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_domain_model_base.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_dynamic_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_events_security_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_execution_result.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hatch_build_targets.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_health_probes.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_edge_cases.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_hook_registry_scenarios.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_identity_generators_and_ambient.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_infra_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_input_sanitizers.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_interceptors.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_json_serialization_backend.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_apply_redaction.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_bridging.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_debug.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_di_provider.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_factory.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_init.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_redaction.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_redaction_compound.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_logging_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_m13_m14_verification.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapper.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapper_enhanced.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_mapping.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_enhancements.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_middleware_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_scan_and_provide.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_module_system.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_no_db_imports.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_observability.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_orchestrator_parallel.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_p2_scope_log_level.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_context.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_data.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_primitives_registry.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_provider_boot_enhanced.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_provider_decorator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_quadkit_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_quadkit_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_repr_helpers.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_resilience_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_combinators.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_core.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_pipeline.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_pipeline_and_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_types_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_result_utils.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_round22_hardening.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_round41_hardening.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_saga_primitives.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_sampling_and_config.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_secret_stores_and_rotation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_serialization_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_serialization_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_service_descriptor.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_structured_logging.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_time_ops.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_coercion.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_exceptions.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_rules.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/test_validation_validator_engine.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/__init__.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/conftest.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_async_validator.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_coercion.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_helpers.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_constants.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_constants_new.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_fields.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_fields_extended.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_init.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_introspection.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_module.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validation_types.py +0 -0
- {quadkit-0.0.2 → quadkit-0.0.3}/tests/unit/validation/test_validator.py +0 -0
quadkit-0.0.3/.gitignore
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Generated public-repository ignore rules.
|
|
2
|
+
# Private monorepo paths are intentionally not referenced here.
|
|
3
|
+
|
|
4
|
+
__pycache__/
|
|
5
|
+
*.py[cod]
|
|
6
|
+
*.so
|
|
7
|
+
*.egg-info/
|
|
8
|
+
.venv/
|
|
9
|
+
venv/
|
|
10
|
+
.env
|
|
11
|
+
.env.*
|
|
12
|
+
!.env.example
|
|
13
|
+
.pytest_cache/
|
|
14
|
+
.ruff_cache/
|
|
15
|
+
.mypy_cache/
|
|
16
|
+
.coverage
|
|
17
|
+
coverage.xml
|
|
18
|
+
htmlcov/
|
|
19
|
+
build/
|
|
20
|
+
dist/
|
|
21
|
+
*.log
|
|
22
|
+
.DS_Store
|
|
23
|
+
.idea/
|
|
24
|
+
.vscode/
|
quadkit-0.0.3/PKG-INFO
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
|
+
Name: quadkit
|
|
3
|
+
Version: 0.0.3
|
|
4
|
+
Summary: Async-first DI/IoC framework for Python — core package
|
|
5
|
+
Project-URL: Homepage, https://quadkit.dev
|
|
6
|
+
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
7
|
+
Project-URL: Documentation, https://quadkit.dev
|
|
8
|
+
Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
|
|
10
|
+
Author-email: Quadkit Framework Team <team@quadkit.dev>
|
|
11
|
+
Maintainer-email: Quadkit Framework Team <team@quadkit.dev>
|
|
12
|
+
License: Apache-2.0
|
|
13
|
+
License-File: LICENSE
|
|
14
|
+
License-File: NOTICE
|
|
15
|
+
Keywords: async,dependency-injection,framework,ioc,provider-pattern
|
|
16
|
+
Classifier: Development Status :: 3 - Alpha
|
|
17
|
+
Classifier: Framework :: AsyncIO
|
|
18
|
+
Classifier: Intended Audience :: Developers
|
|
19
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
20
|
+
Classifier: Operating System :: OS Independent
|
|
21
|
+
Classifier: Programming Language :: Python :: 3
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
26
|
+
Classifier: Typing :: Typed
|
|
27
|
+
Requires-Python: >=3.11
|
|
28
|
+
Requires-Dist: orjson>=3.0.0
|
|
29
|
+
Requires-Dist: pydantic>=2.10.0
|
|
30
|
+
Requires-Dist: quadkit-contracts>=0.0.2
|
|
31
|
+
Requires-Dist: structlog<27,>=25.1.0
|
|
32
|
+
Provides-Extra: codegen
|
|
33
|
+
Requires-Dist: jinja2>=3.1.0; extra == 'codegen'
|
|
34
|
+
Provides-Extra: dev
|
|
35
|
+
Requires-Dist: mypy>=1.0.0; extra == 'dev'
|
|
36
|
+
Requires-Dist: pre-commit>=3.0.0; extra == 'dev'
|
|
37
|
+
Requires-Dist: ruff>=0.16.4; extra == 'dev'
|
|
38
|
+
Provides-Extra: docs
|
|
39
|
+
Requires-Dist: mkdocs-material>=9.0.0; extra == 'docs'
|
|
40
|
+
Requires-Dist: mkdocs>=1.4.0; extra == 'docs'
|
|
41
|
+
Provides-Extra: security
|
|
42
|
+
Requires-Dist: cryptography>=41.0.0; extra == 'security'
|
|
43
|
+
Provides-Extra: test
|
|
44
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == 'test'
|
|
45
|
+
Requires-Dist: pytest-cov>=4.0.0; extra == 'test'
|
|
46
|
+
Requires-Dist: pytest-mock>=3.10.0; extra == 'test'
|
|
47
|
+
Requires-Dist: pytest>=8.0.0; extra == 'test'
|
|
48
|
+
Provides-Extra: web
|
|
49
|
+
Requires-Dist: quadkit-web[granian]>=0.0.2; extra == 'web'
|
|
50
|
+
Description-Content-Type: text/markdown
|
|
51
|
+
|
|
52
|
+
# quadkit
|
|
53
|
+
|
|
54
|
+
Async-first application framework for Python: dependency-injection
|
|
55
|
+
container, application lifecycle, typed configuration, and the `Result`
|
|
56
|
+
error model. This is the core package; everything else published from
|
|
57
|
+
this repository builds on it.
|
|
58
|
+
|
|
59
|
+
For application developers — write providers and modules, bind
|
|
60
|
+
contracts, and let one container boot them in order.
|
|
61
|
+
|
|
62
|
+
## Installation
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
uv add quadkit
|
|
66
|
+
# batteries-included web stack:
|
|
67
|
+
uv add "quadkit[web]"
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Requires **Python >= 3.11**.
|
|
71
|
+
|
|
72
|
+
## Minimal working example
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
import asyncio
|
|
76
|
+
|
|
77
|
+
from quadkit import Application
|
|
78
|
+
from quadkit.contracts.core.di import ContainerRegistrarProtocol
|
|
79
|
+
from quadkit.di.provider import Provider
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
class Settings:
|
|
83
|
+
greeting = "hello, quadkit"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class SettingsProvider(Provider):
|
|
87
|
+
async def register(self, container: ContainerRegistrarProtocol) -> None:
|
|
88
|
+
container.singleton(Settings, instance=Settings())
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
async def main() -> None:
|
|
92
|
+
app = Application()
|
|
93
|
+
app.add_provider(SettingsProvider())
|
|
94
|
+
await app.start()
|
|
95
|
+
try:
|
|
96
|
+
settings = await app.container.resolve(Settings)
|
|
97
|
+
print(settings.greeting)
|
|
98
|
+
finally:
|
|
99
|
+
await app.stop()
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
asyncio.run(main())
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
For the web quickstart (a real endpoint in minutes), see
|
|
106
|
+
[the docs](../../docs/getting-started/first-app.md).
|
|
107
|
+
|
|
108
|
+
## Optional extras
|
|
109
|
+
|
|
110
|
+
| Extra | Contents |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
|
|
113
|
+
| `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
|
|
114
|
+
| `quadkit[security]` | `cryptography` (signing/token helpers) |
|
|
115
|
+
| `quadkit[codegen]` | code generation toolchain |
|
|
116
|
+
| `quadkit[docs]` / `[dev]` | documentation / development tooling |
|
|
117
|
+
|
|
118
|
+
## Public API entry points
|
|
119
|
+
|
|
120
|
+
```python
|
|
121
|
+
from quadkit import Application, Result, Ok, Err
|
|
122
|
+
from quadkit.di.provider import Provider
|
|
123
|
+
from quadkit.di.container import Container
|
|
124
|
+
from quadkit.logging import get_logger
|
|
125
|
+
from quadkit.contracts.core.di import (
|
|
126
|
+
ContainerRegistrarProtocol,
|
|
127
|
+
ContainerResolverProtocol,
|
|
128
|
+
)
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Concepts: [contracts](../../docs/concepts/contracts.md) ·
|
|
132
|
+
[dependency injection](../../docs/concepts/dependency-injection.md) ·
|
|
133
|
+
[modules](../../docs/concepts/modules.md) ·
|
|
134
|
+
[lifecycle](../../docs/concepts/lifecycle.md) ·
|
|
135
|
+
[async model](../../docs/concepts/async-model.md).
|
|
136
|
+
|
|
137
|
+
## Configuration
|
|
138
|
+
|
|
139
|
+
`application.yaml` at the working directory, validated against typed
|
|
140
|
+
config models at boot (unknown keys fail fast); application metadata
|
|
141
|
+
lives at the root (`name`, `version`, `description`); every typed key
|
|
142
|
+
overrides from the environment with `QK_<SECTION>__<KEY>`. Use
|
|
143
|
+
`QK_PROFILE` to select a profile. See
|
|
144
|
+
[configuration](../../docs/getting-started/configuration.md).
|
|
145
|
+
|
|
146
|
+
## Error handling
|
|
147
|
+
|
|
148
|
+
`Result[T, E]` for expected domain failures; the
|
|
149
|
+
`quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
|
|
150
|
+
NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
|
|
151
|
+
else. The web layer renders both as problem responses — see
|
|
152
|
+
[error handling](../../docs/guides/error-handling.md).
|
|
153
|
+
|
|
154
|
+
## Testing
|
|
155
|
+
|
|
156
|
+
Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
|
|
157
|
+
your application in-process (with `overrides={Contract: fake}` for test
|
|
158
|
+
doubles), no server required. See
|
|
159
|
+
[testing](../../docs/getting-started/testing.md).
|
|
160
|
+
|
|
161
|
+
## Security
|
|
162
|
+
|
|
163
|
+
Never put secrets in `application.yaml` — pass them through `QK_*`
|
|
164
|
+
environment variables or a secret store. Unexpected exceptions never
|
|
165
|
+
leak internals to clients. See
|
|
166
|
+
[secure configuration](../../docs/security/secure-configuration.md) and
|
|
167
|
+
report vulnerabilities privately per
|
|
168
|
+
[SECURITY.md](../../SECURITY.md).
|
|
169
|
+
|
|
170
|
+
## Stability
|
|
171
|
+
|
|
172
|
+
Version `0.0.3` in the `0.x` series, released in lockstep with the
|
|
173
|
+
other four distributions; APIs may change between minor versions until
|
|
174
|
+
1.0 — pin an exact version
|
|
175
|
+
(`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
|
|
176
|
+
[stability and compatibility](../../docs/reference/stability.md).
|
|
177
|
+
|
|
178
|
+
Changelog: [`CHANGELOG.md`](./CHANGELOG.md) ·
|
|
179
|
+
Issues: <https://github.com/dbtinoy-/quadkit/issues>
|
quadkit-0.0.3/README.md
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# quadkit
|
|
2
|
+
|
|
3
|
+
Async-first application framework for Python: dependency-injection
|
|
4
|
+
container, application lifecycle, typed configuration, and the `Result`
|
|
5
|
+
error model. This is the core package; everything else published from
|
|
6
|
+
this repository builds on it.
|
|
7
|
+
|
|
8
|
+
For application developers — write providers and modules, bind
|
|
9
|
+
contracts, and let one container boot them in order.
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uv add quadkit
|
|
15
|
+
# batteries-included web stack:
|
|
16
|
+
uv add "quadkit[web]"
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Requires **Python >= 3.11**.
|
|
20
|
+
|
|
21
|
+
## Minimal working example
|
|
22
|
+
|
|
23
|
+
```python
|
|
24
|
+
import asyncio
|
|
25
|
+
|
|
26
|
+
from quadkit import Application
|
|
27
|
+
from quadkit.contracts.core.di import ContainerRegistrarProtocol
|
|
28
|
+
from quadkit.di.provider import Provider
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class Settings:
|
|
32
|
+
greeting = "hello, quadkit"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class SettingsProvider(Provider):
|
|
36
|
+
async def register(self, container: ContainerRegistrarProtocol) -> None:
|
|
37
|
+
container.singleton(Settings, instance=Settings())
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def main() -> None:
|
|
41
|
+
app = Application()
|
|
42
|
+
app.add_provider(SettingsProvider())
|
|
43
|
+
await app.start()
|
|
44
|
+
try:
|
|
45
|
+
settings = await app.container.resolve(Settings)
|
|
46
|
+
print(settings.greeting)
|
|
47
|
+
finally:
|
|
48
|
+
await app.stop()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
asyncio.run(main())
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
For the web quickstart (a real endpoint in minutes), see
|
|
55
|
+
[the docs](../../docs/getting-started/first-app.md).
|
|
56
|
+
|
|
57
|
+
## Optional extras
|
|
58
|
+
|
|
59
|
+
| Extra | Contents |
|
|
60
|
+
| --- | --- |
|
|
61
|
+
| `quadkit[web]` | `quadkit-web[granian]` — the full web stack |
|
|
62
|
+
| `quadkit[test]` | `pytest`, `pytest-asyncio`, `pytest-cov`, `pytest-mock` |
|
|
63
|
+
| `quadkit[security]` | `cryptography` (signing/token helpers) |
|
|
64
|
+
| `quadkit[codegen]` | code generation toolchain |
|
|
65
|
+
| `quadkit[docs]` / `[dev]` | documentation / development tooling |
|
|
66
|
+
|
|
67
|
+
## Public API entry points
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
from quadkit import Application, Result, Ok, Err
|
|
71
|
+
from quadkit.di.provider import Provider
|
|
72
|
+
from quadkit.di.container import Container
|
|
73
|
+
from quadkit.logging import get_logger
|
|
74
|
+
from quadkit.contracts.core.di import (
|
|
75
|
+
ContainerRegistrarProtocol,
|
|
76
|
+
ContainerResolverProtocol,
|
|
77
|
+
)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Concepts: [contracts](../../docs/concepts/contracts.md) ·
|
|
81
|
+
[dependency injection](../../docs/concepts/dependency-injection.md) ·
|
|
82
|
+
[modules](../../docs/concepts/modules.md) ·
|
|
83
|
+
[lifecycle](../../docs/concepts/lifecycle.md) ·
|
|
84
|
+
[async model](../../docs/concepts/async-model.md).
|
|
85
|
+
|
|
86
|
+
## Configuration
|
|
87
|
+
|
|
88
|
+
`application.yaml` at the working directory, validated against typed
|
|
89
|
+
config models at boot (unknown keys fail fast); application metadata
|
|
90
|
+
lives at the root (`name`, `version`, `description`); every typed key
|
|
91
|
+
overrides from the environment with `QK_<SECTION>__<KEY>`. Use
|
|
92
|
+
`QK_PROFILE` to select a profile. See
|
|
93
|
+
[configuration](../../docs/getting-started/configuration.md).
|
|
94
|
+
|
|
95
|
+
## Error handling
|
|
96
|
+
|
|
97
|
+
`Result[T, E]` for expected domain failures; the
|
|
98
|
+
`quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
|
|
99
|
+
NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
|
|
100
|
+
else. The web layer renders both as problem responses — see
|
|
101
|
+
[error handling](../../docs/guides/error-handling.md).
|
|
102
|
+
|
|
103
|
+
## Testing
|
|
104
|
+
|
|
105
|
+
Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
|
|
106
|
+
your application in-process (with `overrides={Contract: fake}` for test
|
|
107
|
+
doubles), no server required. See
|
|
108
|
+
[testing](../../docs/getting-started/testing.md).
|
|
109
|
+
|
|
110
|
+
## Security
|
|
111
|
+
|
|
112
|
+
Never put secrets in `application.yaml` — pass them through `QK_*`
|
|
113
|
+
environment variables or a secret store. Unexpected exceptions never
|
|
114
|
+
leak internals to clients. See
|
|
115
|
+
[secure configuration](../../docs/security/secure-configuration.md) and
|
|
116
|
+
report vulnerabilities privately per
|
|
117
|
+
[SECURITY.md](../../SECURITY.md).
|
|
118
|
+
|
|
119
|
+
## Stability
|
|
120
|
+
|
|
121
|
+
Version `0.0.3` in the `0.x` series, released in lockstep with the
|
|
122
|
+
other four distributions; APIs may change between minor versions until
|
|
123
|
+
1.0 — pin an exact version
|
|
124
|
+
(`quadkit==0.0.3`) or a tight range (`>=0.0.3,<0.1.0`). Full policy:
|
|
125
|
+
[stability and compatibility](../../docs/reference/stability.md).
|
|
126
|
+
|
|
127
|
+
Changelog: [`CHANGELOG.md`](./CHANGELOG.md) ·
|
|
128
|
+
Issues: <https://github.com/dbtinoy-/quadkit/issues>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
# Top-level env var prefix: QK_ (nested delimiter: __)
|
|
6
6
|
#
|
|
7
7
|
# Core fields are declared at the top level of this file.
|
|
8
|
-
# Extension packages (
|
|
8
|
+
# Extension packages (the optional provider, the optional provider, etc.) each add their own
|
|
9
9
|
# top-level section (e.g. cache:, sql:, ai:) read by their own Config class.
|
|
10
10
|
|
|
11
11
|
# -- Application Identity --------------------------------------------------
|
|
@@ -243,7 +243,7 @@ security:
|
|
|
243
243
|
pbkdf2_iterations: 600000
|
|
244
244
|
|
|
245
245
|
# -- Observability ---------------------------------------------------------
|
|
246
|
-
# NEW -- Core observability hooks. Full OTLP/Prometheus config is in
|
|
246
|
+
# NEW -- Core observability hooks. Full OTLP/Prometheus config is in the optional provider.
|
|
247
247
|
|
|
248
248
|
observability:
|
|
249
249
|
# Master switch. When false, no-op implementations are used unconditionally.
|
|
@@ -10,10 +10,7 @@
|
|
|
10
10
|
# - Structured logging foundation
|
|
11
11
|
#
|
|
12
12
|
# It does NOT contain:
|
|
13
|
-
# - Database code → quadkit-sql
|
|
14
|
-
# - Auth/JWT/crypto → quadkit-auth
|
|
15
13
|
# - HTTP/ASGI/routing → quadkit-web
|
|
16
|
-
# - Message queue / email → quadkit-queue / quadkit-mailer / quadkit-notification
|
|
17
14
|
# - Any domain-specific feature
|
|
18
15
|
#
|
|
19
16
|
# Core should be lightweight. `pip install quadkit` should take seconds,
|
|
@@ -30,7 +27,7 @@ build-backend = "hatchling.build"
|
|
|
30
27
|
|
|
31
28
|
[project]
|
|
32
29
|
name = "quadkit"
|
|
33
|
-
version = "0.0.
|
|
30
|
+
version = "0.0.3"
|
|
34
31
|
description = "Async-first DI/IoC framework for Python — core package"
|
|
35
32
|
readme = "README.md"
|
|
36
33
|
requires-python = ">=3.11"
|
|
@@ -130,7 +127,7 @@ web = [
|
|
|
130
127
|
# events, tasks, monitor, graphql) were removed. Those packages are not
|
|
131
128
|
# published, so the extras resolved against name-reservation placeholders
|
|
132
129
|
# that contain no code: `pip install quadkit[cache]` succeeded and then
|
|
133
|
-
# `import
|
|
130
|
+
# `import the optional provider module` raised ModuleNotFoundError. Install extension
|
|
134
131
|
# packages directly once they are published.
|
|
135
132
|
|
|
136
133
|
# =============================================================================
|
|
@@ -287,3 +284,4 @@ show_missing = true
|
|
|
287
284
|
[tool.uv.sources]
|
|
288
285
|
quadkit-contracts = { workspace = true }
|
|
289
286
|
|
|
287
|
+
|
|
@@ -439,7 +439,9 @@ class Application(SecretsMixin, HealthProbeMixin):
|
|
|
439
439
|
return self._apply_details_policy(
|
|
440
440
|
self._probe_unavailable_result(HealthCheckCategory.STARTUP)
|
|
441
441
|
)
|
|
442
|
-
|
|
442
|
+
started = await self._orchestrator.run_startup(timeout)
|
|
443
|
+
started = self._baseline_component(started, HealthCheckCategory.STARTUP)
|
|
444
|
+
return self._apply_details_policy(started)
|
|
443
445
|
|
|
444
446
|
# -- Convenience -------------------------------------------------------
|
|
445
447
|
|
|
@@ -97,6 +97,32 @@ class HealthProbeMixin:
|
|
|
97
97
|
AggregateHealthResult(components=list(raw.values()))
|
|
98
98
|
)
|
|
99
99
|
|
|
100
|
+
def _baseline_component(
|
|
101
|
+
self,
|
|
102
|
+
result: AggregateHealthResult,
|
|
103
|
+
category: HealthCheckCategory,
|
|
104
|
+
) -> AggregateHealthResult:
|
|
105
|
+
"""Ensure a running application always reports a baseline component.
|
|
106
|
+
|
|
107
|
+
Probe categories aggregate whatever checks register against them,
|
|
108
|
+
and an empty pool would otherwise surface as ``UNKNOWN``. The
|
|
109
|
+
running application itself is the truthful baseline signal: live,
|
|
110
|
+
started, and able to serve. Registered checks still gate the
|
|
111
|
+
aggregate — seeding only applies when nothing else reported.
|
|
112
|
+
"""
|
|
113
|
+
if result.components:
|
|
114
|
+
return result
|
|
115
|
+
return AggregateHealthResult(
|
|
116
|
+
components=[
|
|
117
|
+
HealthCheckResult(
|
|
118
|
+
component=self.name,
|
|
119
|
+
status=HealthStatus.HEALTHY,
|
|
120
|
+
message="application running",
|
|
121
|
+
category=category,
|
|
122
|
+
)
|
|
123
|
+
]
|
|
124
|
+
)
|
|
125
|
+
|
|
100
126
|
def _probe_unavailable_result(
|
|
101
127
|
self,
|
|
102
128
|
category: HealthCheckCategory,
|
|
@@ -122,9 +148,9 @@ class HealthProbeMixin:
|
|
|
122
148
|
return self._apply_details_policy(
|
|
123
149
|
self._probe_unavailable_result(HealthCheckCategory.LIVENESS)
|
|
124
150
|
)
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
)
|
|
151
|
+
live = await self._orchestrator.run_liveness(timeout)
|
|
152
|
+
live = self._baseline_component(live, HealthCheckCategory.LIVENESS)
|
|
153
|
+
return self._apply_details_policy(live)
|
|
128
154
|
|
|
129
155
|
async def readiness(self, timeout: float | None = None) -> AggregateHealthResult:
|
|
130
156
|
"""Run readiness checks for the application."""
|
|
@@ -135,9 +161,9 @@ class HealthProbeMixin:
|
|
|
135
161
|
return self._apply_details_policy(
|
|
136
162
|
self._probe_unavailable_result(HealthCheckCategory.READINESS)
|
|
137
163
|
)
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
)
|
|
164
|
+
ready = await self._orchestrator.run_readiness(timeout)
|
|
165
|
+
ready = self._baseline_component(ready, HealthCheckCategory.READINESS)
|
|
166
|
+
return self._apply_details_policy(ready)
|
|
141
167
|
|
|
142
168
|
|
|
143
169
|
__all__ = ["HealthProbeMixin"]
|
|
@@ -15,7 +15,7 @@ Kernel providers (boot order governed by provider ``priority`` and ``dependencie
|
|
|
15
15
|
For a batteries-included bundle that also provides serialization and
|
|
16
16
|
concurrency, use :class:`~quadkit.app.standard.StandardModule` instead.
|
|
17
17
|
|
|
18
|
-
Extension packages (``
|
|
18
|
+
Extension packages (``the optional provider``, ``the optional provider``, ``quadkit-web``,
|
|
19
19
|
etc.) register their own providers via ``app.add_provider()`` or
|
|
20
20
|
``app.add_module()``. ``CoreModule`` intentionally imports **only** from
|
|
21
21
|
``quadkit-contracts`` and the ``quadkit`` core package — zero cross-package
|
|
@@ -329,11 +329,13 @@ def _unknown_config_keys(
|
|
|
329
329
|
"""
|
|
330
330
|
import typing
|
|
331
331
|
|
|
332
|
-
fields = getattr(model_cls, "__dataclass_fields__", {})
|
|
332
|
+
fields = dict(getattr(model_cls, "__dataclass_fields__", {}) or {})
|
|
333
333
|
try:
|
|
334
334
|
hints = typing.get_type_hints(model_cls)
|
|
335
335
|
except Exception: # noqa: BLE001 — unresolvable refs degrade to flat check
|
|
336
336
|
hints = {}
|
|
337
|
+
for hinted_name in hints:
|
|
338
|
+
fields.setdefault(hinted_name, None)
|
|
337
339
|
|
|
338
340
|
unknown: list[str] = []
|
|
339
341
|
for key, value in data.items():
|
|
@@ -4,9 +4,12 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from typing import (
|
|
6
6
|
TYPE_CHECKING,
|
|
7
|
+
Annotated,
|
|
7
8
|
Any,
|
|
8
9
|
TypeVar,
|
|
9
10
|
cast,
|
|
11
|
+
get_args,
|
|
12
|
+
get_origin,
|
|
10
13
|
overload,
|
|
11
14
|
)
|
|
12
15
|
|
|
@@ -403,6 +406,17 @@ class Container(
|
|
|
403
406
|
consumer_name = module.__name__ if module else "unknown"
|
|
404
407
|
graph = _module_graph.get()
|
|
405
408
|
|
|
409
|
+
if get_origin(service_type) is Annotated:
|
|
410
|
+
annotated_args = get_args(service_type)
|
|
411
|
+
if annotated_args:
|
|
412
|
+
service_type = annotated_args[0]
|
|
413
|
+
|
|
414
|
+
providing_module = self._registry.providing_module(service_type)
|
|
415
|
+
if providing_module is module and module is not None:
|
|
416
|
+
# Private to the consuming module itself — no
|
|
417
|
+
# cross-module surface is involved.
|
|
418
|
+
return await self.__service_resolver.resolve(service_type)
|
|
419
|
+
|
|
406
420
|
if (
|
|
407
421
|
graph is not None
|
|
408
422
|
and module is not None
|
|
@@ -421,27 +435,44 @@ class Container(
|
|
|
421
435
|
exporting_names = [node.name for node in exporting_nodes]
|
|
422
436
|
|
|
423
437
|
if not exporting_names:
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
438
|
+
if providing_module is None:
|
|
439
|
+
# Not registered through any module and not
|
|
440
|
+
# exported anywhere — a standalone or framework
|
|
441
|
+
# service, outside the module surface.
|
|
442
|
+
return await self.__service_resolver.resolve(service_type)
|
|
443
|
+
providing_name = getattr(
|
|
444
|
+
providing_module, "__name__", "its provider module"
|
|
445
|
+
)
|
|
446
|
+
message = (
|
|
447
|
+
f"Module '{consumer_name}' cannot resolve "
|
|
448
|
+
f"'{service_type.__name__}': provided by "
|
|
449
|
+
f"'{providing_name}' but not exported by it"
|
|
450
|
+
)
|
|
451
|
+
hint = (
|
|
452
|
+
f"Export {service_type.__name__} from "
|
|
453
|
+
f"'{providing_name}', or provide it from a "
|
|
454
|
+
"global module."
|
|
455
|
+
)
|
|
456
|
+
else:
|
|
457
|
+
exported_types = sorted(
|
|
458
|
+
{
|
|
459
|
+
export.__name__
|
|
460
|
+
for node in exporting_nodes
|
|
461
|
+
for export in getattr(node, "exports", [])
|
|
462
|
+
}
|
|
463
|
+
)
|
|
464
|
+
message = format_visibility_error(
|
|
465
|
+
consumer_module=consumer_name,
|
|
466
|
+
consumer_provider=consumer_name,
|
|
467
|
+
provider_module=exporting_names,
|
|
468
|
+
service_type=service_type.__name__,
|
|
469
|
+
exported_types=exported_types,
|
|
470
|
+
consumer_imports=consumer_imports,
|
|
471
|
+
)
|
|
472
|
+
hint = (
|
|
473
|
+
f"Import one of {exporting_names} "
|
|
474
|
+
f"into {consumer_name}, or make it global."
|
|
475
|
+
)
|
|
445
476
|
else:
|
|
446
477
|
message = (
|
|
447
478
|
f"Module '{consumer_name}' cannot resolve "
|
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
import contextlib
|
|
5
6
|
from typing import TYPE_CHECKING, TypeVar
|
|
6
7
|
|
|
7
8
|
from quadkit.contracts.exceptions import ContainerError
|
|
9
|
+
from quadkit.di.context import get_current_module
|
|
8
10
|
from quadkit.di.resolution.registry import ServiceRegistry
|
|
9
11
|
from quadkit.logging import get_logger
|
|
10
12
|
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from collections.abc import Iterator
|
|
15
|
+
|
|
11
16
|
if TYPE_CHECKING:
|
|
12
17
|
from quadkit.di.types import ServiceFactory
|
|
13
18
|
|
|
@@ -40,6 +45,24 @@ class ContainerRegistrarImpl:
|
|
|
40
45
|
"""Prevent any further service registrations."""
|
|
41
46
|
self._frozen = True
|
|
42
47
|
|
|
48
|
+
@contextlib.contextmanager
|
|
49
|
+
def _registration_window(self) -> Iterator[None]:
|
|
50
|
+
"""Framework-managed window that reopens registration for the boot phase.
|
|
51
|
+
|
|
52
|
+
``freeze()`` closes registration to user code permanently. Providers
|
|
53
|
+
that materialize services during boot (e.g. ``@provide`` factories)
|
|
54
|
+
bind their products after the container has frozen, which the
|
|
55
|
+
lifecycle manager performs inside this window. The window restores
|
|
56
|
+
the frozen state on exit — including on error — so the freeze
|
|
57
|
+
guarantee outside the boot phase is unchanged.
|
|
58
|
+
"""
|
|
59
|
+
was_frozen = self._frozen
|
|
60
|
+
self._frozen = False
|
|
61
|
+
try:
|
|
62
|
+
yield
|
|
63
|
+
finally:
|
|
64
|
+
self._frozen = was_frozen
|
|
65
|
+
|
|
43
66
|
def clear(self) -> None:
|
|
44
67
|
"""Clear all registered services.
|
|
45
68
|
|
|
@@ -71,6 +94,7 @@ class ContainerRegistrarImpl:
|
|
|
71
94
|
"Cannot register transient service after container is frozen",
|
|
72
95
|
)
|
|
73
96
|
self._registry.transient(service_type, factory, validate=validate)
|
|
97
|
+
self._registry.attribute(service_type, get_current_module())
|
|
74
98
|
|
|
75
99
|
def singleton(
|
|
76
100
|
self,
|
|
@@ -104,6 +128,7 @@ class ContainerRegistrarImpl:
|
|
|
104
128
|
factory=factory,
|
|
105
129
|
validate=validate,
|
|
106
130
|
)
|
|
131
|
+
self._registry.attribute(service_type, get_current_module())
|
|
107
132
|
|
|
108
133
|
def scoped(
|
|
109
134
|
self,
|
|
@@ -129,6 +154,7 @@ class ContainerRegistrarImpl:
|
|
|
129
154
|
"Cannot register scoped service after container is frozen",
|
|
130
155
|
)
|
|
131
156
|
self._registry.scoped(service_type, factory, validate=validate, name=name)
|
|
157
|
+
self._registry.attribute(service_type, get_current_module())
|
|
132
158
|
|
|
133
159
|
def override(self, service_type: type[T], instance: T) -> None:
|
|
134
160
|
"""Replace a service registration for testing purposes.
|
|
@@ -97,6 +97,13 @@ def injectable(
|
|
|
97
97
|
) -> Callable[[type[T]], type[T]] | type[T]:
|
|
98
98
|
"""Decorator to mark a class as injectable.
|
|
99
99
|
|
|
100
|
+
The ``scope`` metadata is honored where a descriptor is created for the
|
|
101
|
+
class: by ``discover_injectables()`` (module scanning) and by explicit
|
|
102
|
+
Provider registration. Resolving the class directly from a bare
|
|
103
|
+
``Container`` without either step is not supported — the container only
|
|
104
|
+
auto-wires classes carrying ``@inject``-style constructor markers and
|
|
105
|
+
raises ``QK_ERR_DI_004`` otherwise.
|
|
106
|
+
|
|
100
107
|
Args:
|
|
101
108
|
scope_or_cls: The service scope or the class if used without parens.
|
|
102
109
|
name: Optional name for the service registration.
|
|
@@ -127,7 +127,7 @@ class ProviderScanner:
|
|
|
127
127
|
def import_string(dotted_path: str) -> Any:
|
|
128
128
|
"""Import a dotted module path and return the attribute at the end.
|
|
129
129
|
|
|
130
|
-
E.g. '
|
|
130
|
+
E.g. 'the optional provider module' imports 'the optional provider module' and returns
|
|
131
131
|
the 'DatabaseService' attribute.
|
|
132
132
|
"""
|
|
133
133
|
try:
|