quadkit 0.0.44__tar.gz → 0.0.46__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {quadkit-0.0.44 → quadkit-0.0.46}/PKG-INFO +22 -22
- {quadkit-0.0.44 → quadkit-0.0.46}/README.md +17 -17
- {quadkit-0.0.44 → quadkit-0.0.46}/pyproject.toml +5 -5
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/base.py +19 -1
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/channel.py +44 -18
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/collect.py +1 -1
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/errors.py +4 -4
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/orchestrator.py +18 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/resolver.py +20 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/base.py +134 -5
- quadkit-0.0.46/src/quadkit/domain/models/coercion.py +67 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/ambient.py +18 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/processors.py +53 -13
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/config.py +19 -1
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/core/mapper.py +97 -17
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/__init__.py +58 -1
- quadkit-0.0.46/src/quadkit/primitives/typing.py +239 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/domain.py +6 -2
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/coercion.py +16 -6
- quadkit-0.0.46/tests/unit/concurrency/test_channel_close_wakes_receivers.py +115 -0
- quadkit-0.0.46/tests/unit/domain/test_domain_hydration.py +388 -0
- quadkit-0.0.46/tests/unit/mapping/test_auto_map_dataclass.py +142 -0
- quadkit-0.0.46/tests/unit/primitives/test_public_surface_is_static.py +33 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_coercion.py +7 -4
- quadkit-0.0.44/src/quadkit/domain/models/coercion.py +0 -138
- quadkit-0.0.44/src/quadkit/primitives/typing.py +0 -123
- {quadkit-0.0.44 → quadkit-0.0.46}/.gitignore +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/LICENSE +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/NOTICE +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/example.yaml +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/asgi_lifespan.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config/models.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/config_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/events.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/factory.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/health_probes.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/injectable_provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/invoker.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/runner.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/secrets.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/standard.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/app/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/codegen/field_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/channels/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/di/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/parallel.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/executors/task_manager.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/locks/rwlock.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/concurrency/task_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/merge.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/sources.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/lib/watcher.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/main.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/secrets.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/config/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/_graph.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/builder.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/config/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/config/models.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_resolution.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/container_runtime.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/registrar.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/resolver.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/scope.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/container/validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/context.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/decorators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/interceptors.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/strategies.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/extensions/validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/function_provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/integration/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/integration/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/markers.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/compiler.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/context.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/order.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/dynamic.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/graph.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/metadata.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/module/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/events.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/health.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/orchestrator/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/provider_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/context.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/descriptor.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/diagnostics.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/injector.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/invoker.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/store.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/type_hints.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/resolution/validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/di/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/aggregate.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/entity.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/factory.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/models/value_object.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/domain/unit_of_work.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/ambient.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/hooks/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/identity/generator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/README.md +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/models.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/redaction.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/config/sampling.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/configurator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/debug.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/factory.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/redaction.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/logging/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/core/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/mapping/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/caching.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/di.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/observability.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/resilience.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/routing.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/builtins/validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/chain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/exception_filters.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/core/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/middleware/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/core.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/observability/di/sub_providers/observability.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/engine.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/plugins/state.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/builder.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/clock.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context_keys.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/context_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/data.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/lazy.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/core.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/registry/introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/trusted_html.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/primitives/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/core.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/control.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/time_ops.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/operators/transform.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/retry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/reactive/subjects.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/_pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/errors.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/result/utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/canonical_json.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/saga/content_addressed.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/decorators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/encryption/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/encryption/service.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/events.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/chain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/guards/decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/ambient.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/digest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hashing/kdf.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/hooks.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/filename.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/html.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/sanitizer.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/sanitization/url.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/rotation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/store.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/secrets/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/security/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/json.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/backends/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/di/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/domain/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/registry/registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/schema/schema.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/serialization/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/decorators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/engine/validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/rules/rules.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/fields.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/schema/py.typed +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/src/quadkit/validation/types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/_fixtures.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_boot_level.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_cross_method.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_dependency_chain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_exports.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_importers.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_module_health_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_name_lookup.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_corrected_patterns_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_database_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_full_pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/integration/test_monitor_config_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/test.md +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/test_import_diagnostic.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/aop/test_interceptor_timeout.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/clock/test_clock.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_generator_base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_staged_generation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/codegen/test_template_overrides.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_bounded_channel.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_channel.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_config_pool.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_dispatcher.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_sync_bridge.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_task_manager.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/concurrency/test_task_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_config_sources.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_env_interpolation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_loader_fail_fast.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_logging_redaction_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_logging_sampling.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_profile_overlay.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_scoping.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_secrets_validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_strict_bool_env.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/config/test_strict_sections.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_context_correlation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_core_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_core_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_request_context_di.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/test_typing.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/core/validation/test_protocols.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/integration/test_provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_compiler.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_dynamic.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_errors.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_global.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_graph_reflection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_health_graph.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_integration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_module_lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_reexport.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_stub_compiler.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_stub_decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/module/test_visibility.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_advanced_features.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_basics.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_builder.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_freeze.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_hardening.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_container_visibility.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_decorators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_descriptor.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_decorators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_diagnostics.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_extensions_discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_extensions_validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_function_provider_boot.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_graph_validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_interceptor_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_invoker_unit.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_visibility_boot.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_named_binding.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_orchestrator_health.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_basics.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_config_injection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_conformance.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_orchestration.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_reset_state.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_provider_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_scope_concurrency.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_scope_manager.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_service_store.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_type_hints.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/di/test_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_aggregates.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_init.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_model_strict.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_domain_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_models_factory.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/domain/test_value_object.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/identity/test_identity.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/logging/test_logging_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_auto_map.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_mapper.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_mapping_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_protocol.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/mapping/test_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_builtins.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_chain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_config_alignment.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_exception_filters.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_chain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_routing.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_middleware_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_registry_defaults.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_engine.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_state.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_state_hardening.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/plugins/test_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_primitives_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_registry_advanced.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_registry_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/primitives/test_trusted_html.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_control.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_core.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_facade.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_retry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_subjects.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_time_ops.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/reactive/test_transform.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_guards.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_hashing.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_package_hooks_p2.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secret_rotation_policy.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secrets_rotation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_secrets_store.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_api.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_components_p2.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/security/test_security_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_schema.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_domain.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_init.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_json.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/serialization/test_serialization_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_boot_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_config_and_misc.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_discovery.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_health_baseline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_health_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_runner_and_lifespan.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_app_validation_and_misc.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application_base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_application_lifecycle.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_base_and_misc_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_codegen.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_compiler_graph_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_component_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_concurrency_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_hardening.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_quadkit.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_requirements.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_sources.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_config_watcher.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_override.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_resolver_impl.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_container_runtime_mixin.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_context_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_contract_completeness.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_builder.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_lazy.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_core_pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_dependency_injector.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_descriptor.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_di_module_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_domain_model_base.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_dynamic_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_events_security_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_execution_result.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hatch_build_targets.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_health_probes.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_edge_cases.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_hook_registry_scenarios.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_identity_generators_and_ambient.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_infra_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_input_sanitizers.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_interceptors.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_json_serialization_backend.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_apply_redaction.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_bridging.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_debug.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_di_provider.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_factory.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_init.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_redaction.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_redaction_compound.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_logging_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_m13_m14_verification.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapper.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapper_enhanced.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_mapping.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_enhancements.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_middleware_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_scan_and_provide.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_module_system.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_no_db_imports.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_observability.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_orchestrator_parallel.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_p2_scope_log_level.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_context.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_data.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_primitives_registry.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_provider_boot_enhanced.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_provider_decorator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_quadkit_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_quadkit_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_repr_helpers.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_resilience_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_combinators.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_core.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_pipeline.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_pipeline_and_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_types_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_result_utils.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_round22_hardening.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_round41_hardening.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_saga_primitives.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_sampling_and_config.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_secret_stores_and_rotation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_serialization_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_serialization_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_service_descriptor.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_structured_logging.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_time_ops.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_exceptions.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_rules.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/test_validation_validator_engine.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/__init__.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/conftest.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_async_validator.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_coercion.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_helpers.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_constants.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_constants_new.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_fields.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_fields_extended.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_init.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_introspection.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_module.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validation_types.py +0 -0
- {quadkit-0.0.44 → quadkit-0.0.46}/tests/unit/validation/test_validator.py +0 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quadkit
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.46
|
|
4
4
|
Summary: Async-first DI/IoC framework for Python — core package
|
|
5
|
-
Project-URL: Homepage, https://
|
|
5
|
+
Project-URL: Homepage, https://oridecon.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
7
|
-
Project-URL: Documentation, https://
|
|
7
|
+
Project-URL: Documentation, https://oridecon.dev/quadkit/
|
|
8
8
|
Project-URL: Issues, https://github.com/dbtinoy-/quadkit/issues
|
|
9
9
|
Project-URL: Changelog, https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md
|
|
10
|
-
Author-email: Quadkit Framework Team <
|
|
11
|
-
Maintainer-email: Quadkit Framework Team <
|
|
10
|
+
Author-email: Quadkit Framework Team <hello@oridecon.dev>
|
|
11
|
+
Maintainer-email: Quadkit Framework Team <hello@oridecon.dev>
|
|
12
12
|
License: Apache-2.0
|
|
13
13
|
License-File: LICENSE
|
|
14
14
|
License-File: NOTICE
|
|
@@ -140,7 +140,7 @@ asyncio.run(main())
|
|
|
140
140
|
```
|
|
141
141
|
|
|
142
142
|
For the web quickstart (a real endpoint in minutes), see
|
|
143
|
-
[the docs](https://
|
|
143
|
+
[the docs](https://oridecon.dev/quadkit/getting-started/first-app/).
|
|
144
144
|
|
|
145
145
|
## Expected failures are values
|
|
146
146
|
|
|
@@ -172,7 +172,7 @@ result = (
|
|
|
172
172
|
|
|
173
173
|
In controllers, returning an `Err` renders as an RFC 7807 problem
|
|
174
174
|
response automatically — see the
|
|
175
|
-
[error-handling guide](https://
|
|
175
|
+
[error-handling guide](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
|
|
176
176
|
|
|
177
177
|
## Optional extras
|
|
178
178
|
|
|
@@ -203,11 +203,11 @@ Providers can also define an async `boot()` (acquire resources) and
|
|
|
203
203
|
`shutdown()` (release them, in reverse registration order) — the
|
|
204
204
|
container drives the whole lifecycle.
|
|
205
205
|
|
|
206
|
-
Concepts: [contracts](https://
|
|
207
|
-
[dependency injection](https://
|
|
208
|
-
[modules](https://
|
|
209
|
-
[lifecycle](https://
|
|
210
|
-
[async model](https://
|
|
206
|
+
Concepts: [contracts](https://oridecon.dev/quadkit/fundamentals/container-protocols/) ·
|
|
207
|
+
[dependency injection](https://oridecon.dev/quadkit/fundamentals/dependency-injection/) ·
|
|
208
|
+
[modules](https://oridecon.dev/quadkit/fundamentals/modules/) ·
|
|
209
|
+
[lifecycle](https://oridecon.dev/quadkit/fundamentals/application-lifecycle/) ·
|
|
210
|
+
[async model](https://oridecon.dev/quadkit/fundamentals/architecture/).
|
|
211
211
|
|
|
212
212
|
## Configuration
|
|
213
213
|
|
|
@@ -223,7 +223,7 @@ QK_PROFILE=production # select a profile block
|
|
|
223
223
|
```
|
|
224
224
|
|
|
225
225
|
See
|
|
226
|
-
[configuration](https://
|
|
226
|
+
[configuration](https://oridecon.dev/quadkit/getting-started/configuration/).
|
|
227
227
|
|
|
228
228
|
## Error handling
|
|
229
229
|
|
|
@@ -231,36 +231,36 @@ See
|
|
|
231
231
|
`quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
|
|
232
232
|
NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
|
|
233
233
|
else. The web layer renders both as problem responses — see
|
|
234
|
-
[error handling](https://
|
|
234
|
+
[error handling](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
|
|
235
235
|
|
|
236
236
|
## Testing
|
|
237
237
|
|
|
238
238
|
Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
|
|
239
239
|
your application in-process (with `overrides={Contract: fake}` for test
|
|
240
240
|
doubles), no server required. See
|
|
241
|
-
[testing](https://
|
|
241
|
+
[testing](https://oridecon.dev/quadkit/guides/testing/).
|
|
242
242
|
|
|
243
243
|
## Security
|
|
244
244
|
|
|
245
245
|
Never put secrets in `application.yaml` — pass them through `QK_*`
|
|
246
246
|
environment variables or a secret store. Unexpected exceptions never
|
|
247
247
|
leak internals to clients. See
|
|
248
|
-
[secure configuration](https://
|
|
248
|
+
[secure configuration](https://oridecon.dev/quadkit/getting-started/configuration/) and
|
|
249
249
|
report vulnerabilities privately per
|
|
250
250
|
[SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
|
|
251
251
|
|
|
252
252
|
## Stability
|
|
253
253
|
|
|
254
|
-
Version `0.0.
|
|
255
|
-
other
|
|
254
|
+
Version `0.0.46` in the `0.x` series, released in lockstep with the
|
|
255
|
+
other twelve distributions; APIs may change between minor versions until
|
|
256
256
|
1.0 — pin an exact version
|
|
257
|
-
(`quadkit==0.0.
|
|
258
|
-
[stability and compatibility](https://
|
|
257
|
+
(`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
|
|
258
|
+
[stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
|
|
259
259
|
|
|
260
260
|
## Links
|
|
261
261
|
|
|
262
|
-
- **Documentation** — <https://
|
|
263
|
-
- **Getting started** — <https://
|
|
262
|
+
- **Documentation** — <https://oridecon.dev/quadkit/>
|
|
263
|
+
- **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
|
|
264
264
|
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
265
265
|
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
266
266
|
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
@@ -88,7 +88,7 @@ asyncio.run(main())
|
|
|
88
88
|
```
|
|
89
89
|
|
|
90
90
|
For the web quickstart (a real endpoint in minutes), see
|
|
91
|
-
[the docs](https://
|
|
91
|
+
[the docs](https://oridecon.dev/quadkit/getting-started/first-app/).
|
|
92
92
|
|
|
93
93
|
## Expected failures are values
|
|
94
94
|
|
|
@@ -120,7 +120,7 @@ result = (
|
|
|
120
120
|
|
|
121
121
|
In controllers, returning an `Err` renders as an RFC 7807 problem
|
|
122
122
|
response automatically — see the
|
|
123
|
-
[error-handling guide](https://
|
|
123
|
+
[error-handling guide](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
|
|
124
124
|
|
|
125
125
|
## Optional extras
|
|
126
126
|
|
|
@@ -151,11 +151,11 @@ Providers can also define an async `boot()` (acquire resources) and
|
|
|
151
151
|
`shutdown()` (release them, in reverse registration order) — the
|
|
152
152
|
container drives the whole lifecycle.
|
|
153
153
|
|
|
154
|
-
Concepts: [contracts](https://
|
|
155
|
-
[dependency injection](https://
|
|
156
|
-
[modules](https://
|
|
157
|
-
[lifecycle](https://
|
|
158
|
-
[async model](https://
|
|
154
|
+
Concepts: [contracts](https://oridecon.dev/quadkit/fundamentals/container-protocols/) ·
|
|
155
|
+
[dependency injection](https://oridecon.dev/quadkit/fundamentals/dependency-injection/) ·
|
|
156
|
+
[modules](https://oridecon.dev/quadkit/fundamentals/modules/) ·
|
|
157
|
+
[lifecycle](https://oridecon.dev/quadkit/fundamentals/application-lifecycle/) ·
|
|
158
|
+
[async model](https://oridecon.dev/quadkit/fundamentals/architecture/).
|
|
159
159
|
|
|
160
160
|
## Configuration
|
|
161
161
|
|
|
@@ -171,7 +171,7 @@ QK_PROFILE=production # select a profile block
|
|
|
171
171
|
```
|
|
172
172
|
|
|
173
173
|
See
|
|
174
|
-
[configuration](https://
|
|
174
|
+
[configuration](https://oridecon.dev/quadkit/getting-started/configuration/).
|
|
175
175
|
|
|
176
176
|
## Error handling
|
|
177
177
|
|
|
@@ -179,36 +179,36 @@ See
|
|
|
179
179
|
`quadkit-contracts` exception hierarchy (`QuadkitError → DomainError →
|
|
180
180
|
NotFoundError`, `ValidationError`, `ConflictError`, ...) for everything
|
|
181
181
|
else. The web layer renders both as problem responses — see
|
|
182
|
-
[error handling](https://
|
|
182
|
+
[error handling](https://oridecon.dev/quadkit/fundamentals/result-pattern/).
|
|
183
183
|
|
|
184
184
|
## Testing
|
|
185
185
|
|
|
186
186
|
Pair with `quadkit-testing`: `AppTestBed.from_factory(create_app)` boots
|
|
187
187
|
your application in-process (with `overrides={Contract: fake}` for test
|
|
188
188
|
doubles), no server required. See
|
|
189
|
-
[testing](https://
|
|
189
|
+
[testing](https://oridecon.dev/quadkit/guides/testing/).
|
|
190
190
|
|
|
191
191
|
## Security
|
|
192
192
|
|
|
193
193
|
Never put secrets in `application.yaml` — pass them through `QK_*`
|
|
194
194
|
environment variables or a secret store. Unexpected exceptions never
|
|
195
195
|
leak internals to clients. See
|
|
196
|
-
[secure configuration](https://
|
|
196
|
+
[secure configuration](https://oridecon.dev/quadkit/getting-started/configuration/) and
|
|
197
197
|
report vulnerabilities privately per
|
|
198
198
|
[SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md).
|
|
199
199
|
|
|
200
200
|
## Stability
|
|
201
201
|
|
|
202
|
-
Version `0.0.
|
|
203
|
-
other
|
|
202
|
+
Version `0.0.46` in the `0.x` series, released in lockstep with the
|
|
203
|
+
other twelve distributions; APIs may change between minor versions until
|
|
204
204
|
1.0 — pin an exact version
|
|
205
|
-
(`quadkit==0.0.
|
|
206
|
-
[stability and compatibility](https://
|
|
205
|
+
(`quadkit==0.0.46`) or a tight range (`>=0.0.46,<0.1.0`). Full policy:
|
|
206
|
+
[stability and compatibility](https://oridecon.dev/quadkit/ecosystem/compatibility/).
|
|
207
207
|
|
|
208
208
|
## Links
|
|
209
209
|
|
|
210
|
-
- **Documentation** — <https://
|
|
211
|
-
- **Getting started** — <https://
|
|
210
|
+
- **Documentation** — <https://oridecon.dev/quadkit/>
|
|
211
|
+
- **Getting started** — <https://oridecon.dev/quadkit/getting-started/installation/>
|
|
212
212
|
- **Changelog** — <https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md>
|
|
213
213
|
- **Issues** — <https://github.com/dbtinoy-/quadkit/issues>
|
|
214
214
|
- **Security** — report privately per [SECURITY.md](https://github.com/dbtinoy-/quadkit/blob/main/SECURITY.md)
|
|
@@ -29,7 +29,7 @@ build-backend = "hatchling.build"
|
|
|
29
29
|
|
|
30
30
|
[project]
|
|
31
31
|
name = "quadkit"
|
|
32
|
-
version = "0.0.
|
|
32
|
+
version = "0.0.46"
|
|
33
33
|
description = "Async-first DI/IoC framework for Python — core package"
|
|
34
34
|
readme = "README.md"
|
|
35
35
|
requires-python = ">=3.11"
|
|
@@ -55,10 +55,10 @@ classifiers = [
|
|
|
55
55
|
"Typing :: Typed",
|
|
56
56
|
]
|
|
57
57
|
authors = [
|
|
58
|
-
{ name = "Quadkit Framework Team", email = "
|
|
58
|
+
{ name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
|
|
59
59
|
]
|
|
60
60
|
maintainers = [
|
|
61
|
-
{ name = "Quadkit Framework Team", email = "
|
|
61
|
+
{ name = "Quadkit Framework Team", email = "hello@oridecon.dev" },
|
|
62
62
|
]
|
|
63
63
|
|
|
64
64
|
# =============================================================================
|
|
@@ -138,9 +138,9 @@ web = [
|
|
|
138
138
|
# =============================================================================
|
|
139
139
|
|
|
140
140
|
[project.urls]
|
|
141
|
-
Homepage = "https://
|
|
141
|
+
Homepage = "https://oridecon.dev"
|
|
142
142
|
Repository = "https://github.com/dbtinoy-/quadkit"
|
|
143
|
-
Documentation = "https://
|
|
143
|
+
Documentation = "https://oridecon.dev/quadkit/"
|
|
144
144
|
Issues = "https://github.com/dbtinoy-/quadkit/issues"
|
|
145
145
|
Changelog = "https://github.com/dbtinoy-/quadkit/blob/main/CHANGELOG.md"
|
|
146
146
|
|
|
@@ -29,6 +29,7 @@ if TYPE_CHECKING:
|
|
|
29
29
|
from collections.abc import AsyncIterator
|
|
30
30
|
|
|
31
31
|
from quadkit.di.module.dynamic import DynamicModule
|
|
32
|
+
from quadkit.di.module.graph import CompiledModuleGraph
|
|
32
33
|
from quadkit.di.provider import Provider
|
|
33
34
|
from quadkit.logging import LoggerProtocol
|
|
34
35
|
|
|
@@ -73,7 +74,7 @@ class Application(SecretsMixin, HealthProbeMixin):
|
|
|
73
74
|
self._state = AppState.CREATED
|
|
74
75
|
self._container = Container()
|
|
75
76
|
self._container.singleton(type(self), self)
|
|
76
|
-
self._orchestrator = ProviderOrchestrator(self._container)
|
|
77
|
+
self._orchestrator: ProviderOrchestrator = ProviderOrchestrator(self._container)
|
|
77
78
|
|
|
78
79
|
self._config = config or QuadkitConfig.from_env_profile()
|
|
79
80
|
self._container.singleton(QuadkitConfig, self._config)
|
|
@@ -136,6 +137,23 @@ class Application(SecretsMixin, HealthProbeMixin):
|
|
|
136
137
|
"""DI container."""
|
|
137
138
|
return self._container
|
|
138
139
|
|
|
140
|
+
@property
|
|
141
|
+
def module_graph(self) -> CompiledModuleGraph | None:
|
|
142
|
+
"""The compiled module graph, or ``None`` before compilation.
|
|
143
|
+
|
|
144
|
+
Read-only view of what the boot sequence compiled: every module with
|
|
145
|
+
its providers, imports, and fully expanded exports. It exists so
|
|
146
|
+
boot-time guards can assert that what a module *declares* it exports is
|
|
147
|
+
what the container can actually resolve — the failure this graph is
|
|
148
|
+
otherwise blind to, because an export that nothing resolves during
|
|
149
|
+
boot only fails later, at ``QK_ERR_DI_004`` on first use, or never.
|
|
150
|
+
|
|
151
|
+
Returns:
|
|
152
|
+
The compiled graph, or ``None`` when the application has not been
|
|
153
|
+
compiled yet.
|
|
154
|
+
"""
|
|
155
|
+
return self._orchestrator.compiled_graph
|
|
156
|
+
|
|
139
157
|
@property
|
|
140
158
|
def providers(self) -> list[Provider]:
|
|
141
159
|
"""Get all registered providers."""
|
|
@@ -65,6 +65,12 @@ class BoundedChannel(Generic[T]):
|
|
|
65
65
|
)
|
|
66
66
|
self._closed = False
|
|
67
67
|
self._lock = asyncio.Lock()
|
|
68
|
+
#: Set whenever something a waiting receiver cares about happened:
|
|
69
|
+
#: an item arrived or the channel closed. Receivers clear it before
|
|
70
|
+
#: they wait. They never dequeue from a helper task, so an item is
|
|
71
|
+
#: either in the queue or in the consumer's hands — there is no tick
|
|
72
|
+
#: in between where ``is_empty`` lies.
|
|
73
|
+
self._wakeup = asyncio.Event()
|
|
68
74
|
|
|
69
75
|
async def send(self, item: T) -> None:
|
|
70
76
|
"""Send an item, blocking if the channel is full.
|
|
@@ -91,6 +97,7 @@ class BoundedChannel(Generic[T]):
|
|
|
91
97
|
# full, but that means the item was never actually enqueued.
|
|
92
98
|
with suppress(asyncio.QueueFull):
|
|
93
99
|
self._queue.put_nowait(wrapped)
|
|
100
|
+
self._wakeup.set()
|
|
94
101
|
raise
|
|
95
102
|
except asyncio.QueueFull:
|
|
96
103
|
msg = "Channel is full"
|
|
@@ -98,6 +105,7 @@ class BoundedChannel(Generic[T]):
|
|
|
98
105
|
msg,
|
|
99
106
|
capacity=self.capacity,
|
|
100
107
|
) from None
|
|
108
|
+
self._wakeup.set()
|
|
101
109
|
|
|
102
110
|
def send_nowait(self, item: T) -> None:
|
|
103
111
|
"""Send an item without blocking.
|
|
@@ -128,6 +136,7 @@ class BoundedChannel(Generic[T]):
|
|
|
128
136
|
except asyncio.QueueFull:
|
|
129
137
|
msg = "Channel is full"
|
|
130
138
|
raise ChannelFullError(msg, capacity=self.capacity) from None
|
|
139
|
+
self._wakeup.set()
|
|
131
140
|
|
|
132
141
|
async def receive(self) -> T:
|
|
133
142
|
"""Receive an item, blocking if the channel is empty.
|
|
@@ -138,29 +147,40 @@ class BoundedChannel(Generic[T]):
|
|
|
138
147
|
Raises:
|
|
139
148
|
ChannelClosedError: If the channel is closed and empty.
|
|
140
149
|
"""
|
|
141
|
-
|
|
142
|
-
wrapped: _ContextualItem[T] = await self._queue.get()
|
|
143
|
-
except asyncio.CancelledError:
|
|
144
|
-
# If cancelled after the queue internally dequeued an item,
|
|
145
|
-
# put it back so it is not lost. get_nowait will raise
|
|
146
|
-
# QueueEmpty if nothing was actually dequeued yet.
|
|
147
|
-
try:
|
|
148
|
-
item_back = self._queue.get_nowait()
|
|
149
|
-
self._queue.put_nowait(item_back)
|
|
150
|
-
except asyncio.QueueEmpty:
|
|
151
|
-
pass
|
|
152
|
-
raise
|
|
153
|
-
except asyncio.QueueEmpty:
|
|
154
|
-
if self._closed:
|
|
155
|
-
msg = "Channel is closed"
|
|
156
|
-
raise ChannelClosedError(msg) from None
|
|
157
|
-
raise
|
|
150
|
+
wrapped = await self._next_item()
|
|
158
151
|
# Restore sender's context variables so OTel trace spans and other
|
|
159
152
|
# context state are propagated to the consumer.
|
|
160
153
|
for var, value in wrapped.ctx.items():
|
|
161
154
|
var.set(value)
|
|
162
155
|
return wrapped.item
|
|
163
156
|
|
|
157
|
+
async def _next_item(self) -> _ContextualItem[T]:
|
|
158
|
+
"""Dequeue the next wrapped item, or raise once closed and drained.
|
|
159
|
+
|
|
160
|
+
The hot path — an item is already queued — is a plain
|
|
161
|
+
``get_nowait``. Only an empty channel waits, and it waits on one
|
|
162
|
+
wake-up that both :meth:`send` and :meth:`close` raise. Without the
|
|
163
|
+
close half, ``close()`` could not end an ``async for`` over an empty
|
|
164
|
+
channel, and every consumer loop would outlive the thing it consumed.
|
|
165
|
+
|
|
166
|
+
The dequeue itself is always synchronous in the consumer's own task.
|
|
167
|
+
Pulling the item inside a helper task would open a window where the
|
|
168
|
+
queue is already empty but the consumer has not resumed yet — a
|
|
169
|
+
caller polling ``is_empty`` (the event bus's ``flush``) would
|
|
170
|
+
conclude the work was done one tick before it started.
|
|
171
|
+
"""
|
|
172
|
+
while True:
|
|
173
|
+
try:
|
|
174
|
+
return self._queue.get_nowait()
|
|
175
|
+
except asyncio.QueueEmpty:
|
|
176
|
+
if self._closed:
|
|
177
|
+
msg = "Channel is closed"
|
|
178
|
+
raise ChannelClosedError(msg) from None
|
|
179
|
+
# Nothing queued and not closed: both facts were read without an
|
|
180
|
+
# intervening await, so clearing here cannot swallow a wake-up.
|
|
181
|
+
self._wakeup.clear()
|
|
182
|
+
await self._wakeup.wait()
|
|
183
|
+
|
|
164
184
|
def receive_nowait(self) -> T:
|
|
165
185
|
"""Receive an item without blocking.
|
|
166
186
|
|
|
@@ -183,9 +203,15 @@ class BoundedChannel(Generic[T]):
|
|
|
183
203
|
return wrapped.item
|
|
184
204
|
|
|
185
205
|
async def close(self) -> None:
|
|
186
|
-
"""Close the channel. Remaining items can still be received.
|
|
206
|
+
"""Close the channel. Remaining items can still be received.
|
|
207
|
+
|
|
208
|
+
Receivers blocked on an empty channel are woken and get
|
|
209
|
+
:class:`ChannelClosedError` (``StopAsyncIteration`` under
|
|
210
|
+
``async for``), so a consumer loop ends when its producer does.
|
|
211
|
+
"""
|
|
187
212
|
async with self._lock:
|
|
188
213
|
self._closed = True
|
|
214
|
+
self._wakeup.set()
|
|
189
215
|
|
|
190
216
|
@property
|
|
191
217
|
def is_closed(self) -> bool:
|
|
@@ -95,7 +95,7 @@ class CollectPhase:
|
|
|
95
95
|
raise ModuleError(
|
|
96
96
|
f"'{cls.__name__}' is not decorated with @module.\n"
|
|
97
97
|
f"\n"
|
|
98
|
-
f"Reference: {DOCS_BASE_URL}/modules
|
|
98
|
+
f"Reference: {DOCS_BASE_URL}/fundamentals/modules/",
|
|
99
99
|
hint=(
|
|
100
100
|
f"Add @module() to {cls.__name__}, or import "
|
|
101
101
|
f"{cls.__name__}.configure() instead."
|
|
@@ -47,7 +47,7 @@ def format_cycle_error(cycle: list[str]) -> str:
|
|
|
47
47
|
f" 1. Extract shared types into a separate module\n"
|
|
48
48
|
f" 2. Remove the circular import from one side\n"
|
|
49
49
|
f"\n"
|
|
50
|
-
f"Reference: {DOCS_BASE_URL}/modules
|
|
50
|
+
f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
|
|
@@ -88,7 +88,7 @@ def format_missing_import_error(
|
|
|
88
88
|
f" 1. Add {missing_name} to your create_app() via app.add_module()\n"
|
|
89
89
|
f" 2. Or remove {missing_name} from {module_name}.imports\n"
|
|
90
90
|
f"\n"
|
|
91
|
-
f"Reference: {DOCS_BASE_URL}/modules
|
|
91
|
+
f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
|
|
92
92
|
)
|
|
93
93
|
|
|
94
94
|
|
|
@@ -192,7 +192,7 @@ def format_visibility_error(
|
|
|
192
192
|
f" 2. Make the exporting module global with @module(is_global=True)\n"
|
|
193
193
|
f" 3. Depend on a service that is already exported\n"
|
|
194
194
|
f"\n"
|
|
195
|
-
f" Reference: {DOCS_BASE_URL}/modules
|
|
195
|
+
f" Reference: {DOCS_BASE_URL}/fundamentals/modules/"
|
|
196
196
|
)
|
|
197
197
|
|
|
198
198
|
|
|
@@ -232,7 +232,7 @@ def format_duplicate_module_error(
|
|
|
232
232
|
f" 1. Remove one of the add_module() calls\n"
|
|
233
233
|
f" 2. Or merge the configurations into a single configure() call\n"
|
|
234
234
|
f"\n"
|
|
235
|
-
f"Reference: {DOCS_BASE_URL}/modules
|
|
235
|
+
f"Reference: {DOCS_BASE_URL}/fundamentals/modules/"
|
|
236
236
|
)
|
|
237
237
|
|
|
238
238
|
|
|
@@ -110,6 +110,24 @@ class ProviderOrchestrator:
|
|
|
110
110
|
"""
|
|
111
111
|
self._registry._compiled_graph = graph
|
|
112
112
|
|
|
113
|
+
@property
|
|
114
|
+
def compiled_graph(self) -> CompiledModuleGraph | None:
|
|
115
|
+
"""The compiled module graph, or ``None`` before compilation.
|
|
116
|
+
|
|
117
|
+
The public companion to :meth:`set_compiled_graph`. The graph is what
|
|
118
|
+
knows which module declares which export, and the code that needs to
|
|
119
|
+
answer that question lives outside this class: health probes, boot-time
|
|
120
|
+
assertions, and test guards. Without a reader the only way to ask was
|
|
121
|
+
the private ``_compiled_graph``, so every such caller reached into the
|
|
122
|
+
orchestrator's internals — and a rename would have broken them without
|
|
123
|
+
a test to notice.
|
|
124
|
+
|
|
125
|
+
Returns:
|
|
126
|
+
The graph produced by :class:`ModuleCompiler`, or ``None`` when the
|
|
127
|
+
application has not been compiled yet.
|
|
128
|
+
"""
|
|
129
|
+
return self._registry._compiled_graph
|
|
130
|
+
|
|
113
131
|
def add(self, provider: Provider) -> None:
|
|
114
132
|
"""Add a provider to be orchestrated.
|
|
115
133
|
|
|
@@ -187,6 +187,26 @@ class ServiceResolver:
|
|
|
187
187
|
|
|
188
188
|
return instance
|
|
189
189
|
|
|
190
|
+
async def resolve_optional(self, service_type: Any) -> Any | None:
|
|
191
|
+
"""Resolve a service, returning ``None`` when it is not registered.
|
|
192
|
+
|
|
193
|
+
``ContainerResolverProtocol`` has declared this method all along, and
|
|
194
|
+
the container implements it, but the resolver handed to provider
|
|
195
|
+
factories did not: a provider asking for an optional dependency had to
|
|
196
|
+
pair ``has()`` with ``resolve()`` and hope nothing moved in between.
|
|
197
|
+
Absent means absent — a registered service whose construction raises
|
|
198
|
+
still raises.
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
service_type: The type to resolve.
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
The resolved instance, or ``None`` when nothing is registered for it.
|
|
205
|
+
"""
|
|
206
|
+
if not self.can_resolve(service_type):
|
|
207
|
+
return None
|
|
208
|
+
return await self.resolve(service_type)
|
|
209
|
+
|
|
190
210
|
async def _create_instance(self, descriptor: ServiceDescriptor) -> Any:
|
|
191
211
|
"""Create a service instance from its descriptor."""
|
|
192
212
|
impl = descriptor.implementation
|