quadkit 0.0.4__tar.gz → 0.0.42__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.4 → quadkit-0.0.42}/.gitignore +32 -1
- {quadkit-0.0.4 → quadkit-0.0.42}/PKG-INFO +4 -3
- {quadkit-0.0.4 → quadkit-0.0.42}/README.md +2 -2
- {quadkit-0.0.4 → quadkit-0.0.42}/pyproject.toml +2 -1
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/models.py +6 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/codegen/__init__.py +3 -0
- quadkit-0.0.42/src/quadkit/codegen/field_types.py +131 -0
- quadkit-0.0.42/src/quadkit/observability/di/sub_providers/observability.py +68 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_observability.py +45 -0
- quadkit-0.0.4/src/quadkit/observability/di/sub_providers/observability.py +0 -52
- {quadkit-0.0.4 → quadkit-0.0.42}/CHANGELOG.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/LICENSE +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/NOTICE +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/ARCHITECTURE.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/CONFIGURATION.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/GUIDE.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/HOWTOS.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/QUICKSTART.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/SECURITY.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/TROUBLESHOOTING.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/app.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/hero.tape +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/gifs/hero/quadkit-hero.gif +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/docs/plugins.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/example.yaml +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/import_error.txt +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/asgi_lifespan.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config/discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/config_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/events.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/factory.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/health_probes.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/injectable_provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/invoker.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/runner.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/secrets.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/standard.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/app/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/codegen/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/bridges/sync_bridge.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/channel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/channels/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/di/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/dispatcher.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/parallel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/executors/task_manager.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/locks/rwlock.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/concurrency/task_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/merge.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/sources.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/lib/watcher.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/main.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/secrets.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/config/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/_graph.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/builder.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/config/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/config/models.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_resolution.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/container_runtime.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/registrar.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/resolver.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/scope.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/container/validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/context.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/decorators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/aop_interceptors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/interceptors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/strategies.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/extensions/validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/function_provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/integration/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/integration/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/markers.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/_graph_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/compiler.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/context.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/collect.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/detect_cycles.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/expand.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/order.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/protocol.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/validate.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/compiler/phases/visibility.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/dynamic.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/errors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/graph.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/metadata.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/module/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/events.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/health.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/orchestrator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/orchestrator/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/provider_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/context.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/descriptor.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/diagnostics.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/injector.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/invoker.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/resolver.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/store.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/type_hints.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/resolution/validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/di/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/aggregate.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/coercion.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/entity.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/factory.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/models/value_object.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/domain/unit_of_work.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/ambient.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/hooks/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/ambient.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/identity/generator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/README.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/models.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/redaction.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/config/sampling.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/configurator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/debug.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/factory.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/processors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/redaction.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/logging/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/core/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/core/mapper.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/mapping/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/caching.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/di.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/observability.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/resilience.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/routing.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/builtins/validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/chain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/exception_filters.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/core/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/middleware/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/core.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/observability/di/sub_providers/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/engine.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/plugins/state.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/builder.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/clock.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context_keys.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/context_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/data.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/lazy.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/core.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/registry/introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/trusted_html.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/primitives/typing.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/core.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/control.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/time_ops.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/operators/transform.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/retry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/reactive/subjects.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/_pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/errors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/result/utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/canonical_json.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/saga/content_addressed.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/decorators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/encryption/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/encryption/service.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/events.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/chain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/guards/decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/ambient.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/digest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hashing/kdf.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/hooks.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/filename.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/html.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/sanitizer.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/sanitization/url.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/rotation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/store.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/secrets/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/security/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/json.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/backends/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/di/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/domain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/domain/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/registry/registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/schema/schema.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/serialization/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/decorators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/coercion.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/engine/validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/rules/rules.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/fields.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/schema/py.typed +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/src/quadkit/validation/types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/_fixtures.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_boot_level.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_cross_method.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_dependency_chain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_exports.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_importers.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_module_health_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_module_lifecycle_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_name_lookup.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/module/test_stub_enforcement_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/di/test_visibility_enforcement_e2e.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/mapping/test_mapping_lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/middleware/test_middleware_lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_corrected_patterns_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_database_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_full_pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/integration/test_monitor_config_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/test.md +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/test_import_diagnostic.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/aop/test_interceptor_timeout.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/clock/test_clock.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_generator_base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_staged_generation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/codegen/test_template_overrides.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_bounded_channel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_channel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_parallel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_provider_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_concurrency_rwlock.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_config_pool.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_dispatcher.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_sync_bridge.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_task_manager.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/concurrency/test_task_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_config_sources.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_env_interpolation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_loader_fail_fast.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_logging_redaction_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_logging_sampling.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_profile_overlay.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_scoping.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_secrets_validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_strict_bool_env.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/config/test_strict_sections.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_context_correlation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_core_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_core_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_request_context_di.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/test_typing.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/core/validation/test_protocols.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/integration/test_provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_compiler.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_dynamic.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_errors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_global.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_graph_reflection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_health_graph.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_integration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_module_lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_reexport.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_stub_compiler.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_stub_decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/module/test_visibility.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_advanced_features.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_basics.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_builder.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_freeze.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_hardening.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_container_visibility.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_decorators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_descriptor.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_decorators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_di_provider_config_wiring.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_diagnostics.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_extensions_discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_extensions_validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_function_provider_boot.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_graph_validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_interceptor_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_invoker_unit.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_lifecycle_orchestrator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_visibility_boot.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_module_visibility_enforcement.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_named_binding.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_orchestrator_health.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_basics.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_config_injection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_conformance.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_orchestration.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_reset_state.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_provider_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_scope_concurrency.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_scope_manager.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_service_store.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_type_hints.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/di/test_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_aggregates.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_init.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_model_strict.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_domain_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_models_factory.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/domain/test_value_object.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/identity/test_identity.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/logging/test_logging_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_auto_map.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_mapper.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_mapping_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_protocol.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/mapping/test_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_builtins.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_chain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_config_alignment.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_exception_filters.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_chain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_ep_discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_routing.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_middleware_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_p2_retry_traceback.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_registry_defaults.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/middleware/test_registry_with_resilience.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_engine.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_state.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_state_hardening.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/plugins/test_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_primitives_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_registry_advanced.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_registry_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/primitives/test_trusted_html.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_control.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_core.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_facade.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_retry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_subjects.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_time_ops.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/reactive/test_transform.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_guards.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_hashing.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_package_hooks_p2.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secret_rotation_policy.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secrets_rotation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_secrets_store.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_api.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_components_p2.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/security/test_security_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_schema.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_di_provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_domain.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_init.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_json.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/serialization/test_serialization_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_boot_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_config_and_misc.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_discovery.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_health_baseline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_health_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_runner_and_lifespan.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_app_validation_and_misc.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application_base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_application_lifecycle.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_base_and_misc_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_clock_and_pipeline_primitives.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_codegen.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_compiler_graph_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_component_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_concurrency_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_concurrency_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_hardening.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_quadkit.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_requirements.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_sources.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_config_watcher.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_override.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_resolver_impl.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_container_runtime_mixin.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_context_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_contract_completeness.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_builder.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_lazy.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_core_pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_dependency_injector.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_descriptor.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_di_module_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_domain_model_base.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_dynamic_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_events_security_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_execution_result.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hatch_build_targets.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_health_probes.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_edge_cases.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_hook_registry_scenarios.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_identity_generators_and_ambient.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_infra_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_input_sanitizers.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_interceptors.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_json_serialization_backend.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_apply_redaction.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_bridging.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_debug.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_di_provider.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_factory.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_init.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_redaction.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_redaction_compound.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_logging_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_m13_m14_verification.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapper.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapper_enhanced.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_mapping.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_enhancements.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_middleware_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_scan_and_provide.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_module_system.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_no_db_imports.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_orchestrator_parallel.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_p2_scope_log_level.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_context.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_data.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_primitives_registry.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_provider_boot_enhanced.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_provider_decorator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_quadkit_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_quadkit_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_repr_helpers.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_resilience_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_combinators.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_core.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_pipeline.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_pipeline_and_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_types_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_result_utils.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_round22_hardening.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_round41_hardening.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_saga_primitives.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_sampling_and_config.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_secret_stores_and_rotation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_serialization_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_serialization_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_service_descriptor.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_structured_logging.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_time_ops.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_coercion.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_exceptions.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_rules.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/test_validation_validator_engine.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/__init__.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/conftest.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_async_validator.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_coercion.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_helpers.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_constants.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_constants_new.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_fields.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_fields_extended.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_init.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_introspection.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_module.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validation_types.py +0 -0
- {quadkit-0.0.4 → quadkit-0.0.42}/tests/unit/validation/test_validator.py +0 -0
|
@@ -149,6 +149,27 @@ apps/**/*.pyc
|
|
|
149
149
|
apps/**/*.db
|
|
150
150
|
apps/**/*.db-wal
|
|
151
151
|
apps/**/*.db-shm
|
|
152
|
+
apps/**/.env
|
|
153
|
+
apps/**/.env.*
|
|
154
|
+
!apps/**/.env.example
|
|
155
|
+
!apps/**/.env.full.example
|
|
156
|
+
|
|
157
|
+
# Piccolina — nested app tracked in this monorepo (standalone .git removed).
|
|
158
|
+
# Keep marketing packages and deployment secrets out of the tree.
|
|
159
|
+
apps/piccolina/piccolina-marketing/
|
|
160
|
+
apps/piccolina/piccolina-marketing-plans/
|
|
161
|
+
apps/piccolina/secrets/
|
|
162
|
+
apps/piccolina/**/secrets/
|
|
163
|
+
apps/piccolina/**/*.pem
|
|
164
|
+
apps/piccolina/**/*.key
|
|
165
|
+
apps/piccolina/**/.venv/
|
|
166
|
+
apps/piccolina/**/node_modules/
|
|
167
|
+
apps/piccolina/**/__pycache__/
|
|
168
|
+
apps/piccolina/**/*.pyc
|
|
169
|
+
apps/piccolina/**/*.pbf
|
|
170
|
+
apps/piccolina/**/.open-next/
|
|
171
|
+
apps/piccolina/**/storage/
|
|
172
|
+
apps/piccolina/**/.deploy-host
|
|
152
173
|
|
|
153
174
|
# Re-exclude private content under the tiered paths.
|
|
154
175
|
# MUST come after the !...docs/** negations above — last match wins.
|
|
@@ -180,4 +201,14 @@ test.db
|
|
|
180
201
|
!packages/*/quadkit*/docs/gifs/
|
|
181
202
|
!packages/*/quadkit*/docs/gifs/**
|
|
182
203
|
examples/*/screenshot.png
|
|
183
|
-
!banner*
|
|
204
|
+
!banner*
|
|
205
|
+
apps/quadkit-playground/**/node_modules/
|
|
206
|
+
apps/quadkit-playground/**/dist/
|
|
207
|
+
apps/quadkit-playground/**/__pycache__/
|
|
208
|
+
apps/quadkit-playground/**/*.pyc
|
|
209
|
+
apps/quadkit-playground/**/*.db
|
|
210
|
+
apps/quadkit-playground/**/*.db-wal
|
|
211
|
+
apps/quadkit-playground/**/*.db-shm
|
|
212
|
+
apps/quadkit-playground/projects/
|
|
213
|
+
apps/quadkit-playground/quadkit/
|
|
214
|
+
docs/superpowers/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: quadkit
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.42
|
|
4
4
|
Summary: Async-first DI/IoC framework for Python — core package
|
|
5
5
|
Project-URL: Homepage, https://dbtinoy-.github.io/quadkit/
|
|
6
6
|
Project-URL: Repository, https://github.com/dbtinoy-/quadkit
|
|
@@ -27,6 +27,7 @@ Classifier: Typing :: Typed
|
|
|
27
27
|
Requires-Python: >=3.11
|
|
28
28
|
Requires-Dist: orjson<4,>=3.0.0
|
|
29
29
|
Requires-Dist: pydantic<3,>=2.10.0
|
|
30
|
+
Requires-Dist: pyyaml<7,>=6.0.0
|
|
30
31
|
Requires-Dist: quadkit-contracts>=0.0.2
|
|
31
32
|
Requires-Dist: structlog<27,>=25.1.0
|
|
32
33
|
Provides-Extra: codegen
|
|
@@ -250,10 +251,10 @@ report vulnerabilities privately per
|
|
|
250
251
|
|
|
251
252
|
## Stability
|
|
252
253
|
|
|
253
|
-
Version `0.0.
|
|
254
|
+
Version `0.0.42` in the `0.x` series, released in lockstep with the
|
|
254
255
|
other four distributions; APIs may change between minor versions until
|
|
255
256
|
1.0 — pin an exact version
|
|
256
|
-
(`quadkit==0.0.
|
|
257
|
+
(`quadkit==0.0.42`) or a tight range (`>=0.0.42,<0.1.0`). Full policy:
|
|
257
258
|
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
258
259
|
|
|
259
260
|
## Links
|
|
@@ -199,10 +199,10 @@ report vulnerabilities privately per
|
|
|
199
199
|
|
|
200
200
|
## Stability
|
|
201
201
|
|
|
202
|
-
Version `0.0.
|
|
202
|
+
Version `0.0.42` in the `0.x` series, released in lockstep with the
|
|
203
203
|
other four distributions; APIs may change between minor versions until
|
|
204
204
|
1.0 — pin an exact version
|
|
205
|
-
(`quadkit==0.0.
|
|
205
|
+
(`quadkit==0.0.42`) or a tight range (`>=0.0.42,<0.1.0`). Full policy:
|
|
206
206
|
[stability and compatibility](https://dbtinoy-.github.io/quadkit/reference/stability/).
|
|
207
207
|
|
|
208
208
|
## Links
|
|
@@ -30,7 +30,7 @@ build-backend = "hatchling.build"
|
|
|
30
30
|
|
|
31
31
|
[project]
|
|
32
32
|
name = "quadkit"
|
|
33
|
-
version = "0.0.
|
|
33
|
+
version = "0.0.42"
|
|
34
34
|
description = "Async-first DI/IoC framework for Python — core package"
|
|
35
35
|
readme = "README.md"
|
|
36
36
|
requires-python = ">=3.11"
|
|
@@ -74,6 +74,7 @@ dependencies = [
|
|
|
74
74
|
"orjson>=3.0.0,<4",
|
|
75
75
|
"structlog>=25.1.0,<27", # Structured logging foundation
|
|
76
76
|
"pydantic>=2.10.0,<3", # Required: used unconditionally by config, validation
|
|
77
|
+
"pyyaml>=6.0.0,<7", # Required: YAML config file parsing
|
|
77
78
|
]
|
|
78
79
|
|
|
79
80
|
# =============================================================================
|
|
@@ -23,6 +23,12 @@ class AppConfig:
|
|
|
23
23
|
# ``name`` is the canonical YAML key under ``app:``; ``app_name`` remains
|
|
24
24
|
# supported for compatibility with the original flat configuration.
|
|
25
25
|
name: str | None = None
|
|
26
|
+
# ``version`` is the canonical YAML key under ``app:`` (application
|
|
27
|
+
# version string). Declared so apps that pin ``app.version`` in
|
|
28
|
+
# application.yaml bind cleanly — unknown keys raise ConfigSourceError
|
|
29
|
+
# from Application.stop()/get_section().
|
|
30
|
+
version: str = "0.0.0"
|
|
31
|
+
# consumed by: Application — version surfaced in health/telemetry
|
|
26
32
|
# consumed by: OTEL resource attribute, logger context, AppProvider
|
|
27
33
|
debug: bool | str = False
|
|
28
34
|
# consumed by: Application — verbose startup/teardown logging
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from quadkit.codegen.base import GeneratorBase
|
|
2
|
+
from quadkit.codegen.field_types import annotation_for, import_lines
|
|
2
3
|
from quadkit.contracts.cli.generators import GenerationResult
|
|
3
4
|
from quadkit.contracts.cli.parsers import FieldSpec, parse_fields
|
|
4
5
|
|
|
@@ -6,5 +7,7 @@ __all__ = [
|
|
|
6
7
|
"FieldSpec",
|
|
7
8
|
"GenerationResult",
|
|
8
9
|
"GeneratorBase",
|
|
10
|
+
"annotation_for",
|
|
11
|
+
"import_lines",
|
|
9
12
|
"parse_fields",
|
|
10
13
|
]
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"""Field-type vocabulary for the CLI code generators.
|
|
2
|
+
|
|
3
|
+
Field types arrive as free-form identifiers from ``--fields`` strings
|
|
4
|
+
(``order_id:uuid,total:decimal,payload:json``) and generators render them
|
|
5
|
+
straight into annotations -- dataclass fields, Pydantic model fields, function
|
|
6
|
+
signatures. Rendering the token verbatim only
|
|
7
|
+
works while the token happens to be a builtin: ``float`` and ``str`` are fine,
|
|
8
|
+
but ``uuid``, ``datetime``, ``date``, ``time`` and ``json`` are *not* names in
|
|
9
|
+
the generated module, so a payload carrying any of them produced a file that
|
|
10
|
+
raised ``NameError`` on import — the module could not even be collected by
|
|
11
|
+
pytest.
|
|
12
|
+
|
|
13
|
+
Two things have to agree for a field to render correctly, so they live
|
|
14
|
+
together here: the annotation for a token, and the import that annotation
|
|
15
|
+
needs. ``date`` is a ``datetime`` name, ``UUID`` is a ``uuid`` name, and
|
|
16
|
+
``dict[str, Any]`` needs ``Any`` — an annotation vocabulary without its import
|
|
17
|
+
list is how the original bug happened.
|
|
18
|
+
|
|
19
|
+
Unknown tokens fall back to themselves, matching the SQL vocabulary's stance
|
|
20
|
+
that a typo degrades rather than blocks generation; the difference is that a
|
|
21
|
+
*known* token now always renders a name that exists.
|
|
22
|
+
|
|
23
|
+
This lives in ``quadkit.codegen`` because every generator that renders a field
|
|
24
|
+
already imports from here (``parse_fields`` is the other half of the same
|
|
25
|
+
contract): the vocabulary and the parser that produces its input belong
|
|
26
|
+
together, and a second copy is how the two halves drift apart again.
|
|
27
|
+
|
|
28
|
+
``quadkit-sql`` keeps its own table: SQLAlchemy columns need a second mapping
|
|
29
|
+
(``String(length=255)``, ``Text``) that has no meaning for a payload.
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
from __future__ import annotations
|
|
33
|
+
|
|
34
|
+
from collections.abc import Iterable
|
|
35
|
+
import re
|
|
36
|
+
|
|
37
|
+
#: Field type → Python annotation for a dataclass field or signature.
|
|
38
|
+
PY_TYPES: dict[str, str] = {
|
|
39
|
+
# Text — an event payload carries values, so URL-ish tokens stay strings:
|
|
40
|
+
# a domain event is a frozen dataclass, not a validated Pydantic model,
|
|
41
|
+
# and importing a validator type for one field would point the dependency
|
|
42
|
+
# the wrong way.
|
|
43
|
+
"str": "str",
|
|
44
|
+
"string": "str",
|
|
45
|
+
"text": "str",
|
|
46
|
+
"slug": "str",
|
|
47
|
+
"char": "str",
|
|
48
|
+
"email": "str",
|
|
49
|
+
"phone": "str",
|
|
50
|
+
"filename": "str",
|
|
51
|
+
"filepath": "str",
|
|
52
|
+
"enum": "str",
|
|
53
|
+
"url": "str",
|
|
54
|
+
"uri": "str",
|
|
55
|
+
"ipv4": "str",
|
|
56
|
+
"ipv6": "str",
|
|
57
|
+
"ip": "str",
|
|
58
|
+
# Numeric
|
|
59
|
+
"int": "int",
|
|
60
|
+
"integer": "int",
|
|
61
|
+
"bigint": "int",
|
|
62
|
+
"smallint": "int",
|
|
63
|
+
"float": "float",
|
|
64
|
+
"double": "float",
|
|
65
|
+
"number": "float",
|
|
66
|
+
"decimal": "float",
|
|
67
|
+
"numeric": "float",
|
|
68
|
+
"money": "float",
|
|
69
|
+
# Boolean and temporal
|
|
70
|
+
"bool": "bool",
|
|
71
|
+
"boolean": "bool",
|
|
72
|
+
"datetime": "datetime",
|
|
73
|
+
"timestamp": "datetime",
|
|
74
|
+
"date": "date",
|
|
75
|
+
"time": "time",
|
|
76
|
+
# Identifiers and structured data
|
|
77
|
+
"uuid": "UUID",
|
|
78
|
+
"json": "dict[str, Any]",
|
|
79
|
+
"jsonb": "dict[str, Any]",
|
|
80
|
+
"dict": "dict[str, Any]",
|
|
81
|
+
"object": "dict[str, Any]",
|
|
82
|
+
"bytes": "bytes",
|
|
83
|
+
"blob": "bytes",
|
|
84
|
+
"binary": "bytes",
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
#: Annotation → the module and name that provide it.
|
|
88
|
+
ANNOTATION_SOURCES: dict[str, tuple[str, str]] = {
|
|
89
|
+
"UUID": ("uuid", "UUID"),
|
|
90
|
+
"datetime": ("datetime", "datetime"),
|
|
91
|
+
"date": ("datetime", "date"),
|
|
92
|
+
"time": ("datetime", "time"),
|
|
93
|
+
"Any": ("typing", "Any"),
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def annotation_for(field_type: str) -> str:
|
|
98
|
+
"""The Python annotation for a field-spec type token."""
|
|
99
|
+
return PY_TYPES.get(field_type.strip().lower(), field_type.strip())
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def import_lines(
|
|
103
|
+
field_types: Iterable[str], *, always: Iterable[str] = ()
|
|
104
|
+
) -> list[str]:
|
|
105
|
+
"""One import line per module needed by the rendered annotations.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
field_types: Raw field-spec tokens from the ``--fields`` string.
|
|
109
|
+
always: Annotations the template renders outside the payload — the
|
|
110
|
+
event template's ``aggregate_id: UUID``, the command and query
|
|
111
|
+
templates' ``Any`` — so they are imported whether or not a field
|
|
112
|
+
happens to ask for them. Templates have no import machinery of
|
|
113
|
+
their own; this is it.
|
|
114
|
+
"""
|
|
115
|
+
per_module: dict[str, set[str]] = {}
|
|
116
|
+
for field_type in [*field_types, *always]:
|
|
117
|
+
rendered = annotation_for(field_type)
|
|
118
|
+
# Scan the *rendered annotation* rather than looking the token up in a
|
|
119
|
+
# second table: a composite annotation carries more than one name
|
|
120
|
+
# (``dict[str, Any]`` needs ``Any``), and the names are what the file
|
|
121
|
+
# has to import.
|
|
122
|
+
for name, (module, _) in ANNOTATION_SOURCES.items():
|
|
123
|
+
if re.search(rf"\b{name}\b", rendered):
|
|
124
|
+
per_module.setdefault(module, set()).add(name)
|
|
125
|
+
return [
|
|
126
|
+
f"from {module} import {', '.join(sorted(names))}"
|
|
127
|
+
for module, names in sorted(per_module.items())
|
|
128
|
+
]
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
__all__ = ["ANNOTATION_SOURCES", "PY_TYPES", "annotation_for", "import_lines"]
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"""No-op observability provider registered by the Quadkit core framework."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from quadkit.contracts.core.di import (
|
|
6
|
+
ContainerRegistrarProtocol,
|
|
7
|
+
ContainerResolverProtocol,
|
|
8
|
+
)
|
|
9
|
+
from quadkit.contracts.core.health import HealthCheckProtocol
|
|
10
|
+
from quadkit.contracts.observability.metrics import (
|
|
11
|
+
HealthCheckRegistryProtocol,
|
|
12
|
+
MetricsCollectorProtocol,
|
|
13
|
+
MetricsFactoryProtocol,
|
|
14
|
+
MetricsRecorderProtocol,
|
|
15
|
+
)
|
|
16
|
+
from quadkit.contracts.observability.tracing import TracerProtocol
|
|
17
|
+
from quadkit.di.provider import Provider, ProviderPriority
|
|
18
|
+
from quadkit.observability.core import (
|
|
19
|
+
NoOpHealthCheckRegistry,
|
|
20
|
+
NoOpMetricsCollector,
|
|
21
|
+
NoOpTracer,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ObservabilityProvider(Provider):
|
|
26
|
+
"""Provides no-op observability bindings for the core framework."""
|
|
27
|
+
|
|
28
|
+
name = "observability"
|
|
29
|
+
priority = ProviderPriority.INFRASTRUCTURE
|
|
30
|
+
|
|
31
|
+
async def register(self, container: ContainerRegistrarProtocol) -> None:
|
|
32
|
+
"""Register the no-op observability implementations.
|
|
33
|
+
|
|
34
|
+
These bindings are fallbacks: they let application code compile and
|
|
35
|
+
run without ``quadkit-monitor``, but they must never win over a real
|
|
36
|
+
implementation. The container overwrites a token with the last
|
|
37
|
+
registration, so registering unconditionally makes the winner depend
|
|
38
|
+
on module composition order — and in nested module graphs this
|
|
39
|
+
provider lands *after* ``MonitorProvider`` and suppresses the concrete
|
|
40
|
+
collector. Guard each token, the same pattern the other fallback
|
|
41
|
+
sites use (``quadkit-auth``, ``quadkit-cache``, ``quadkit-ai-relay``),
|
|
42
|
+
so whichever real implementation registered first survives.
|
|
43
|
+
"""
|
|
44
|
+
collector = NoOpMetricsCollector()
|
|
45
|
+
if not container.has(MetricsCollectorProtocol):
|
|
46
|
+
container.singleton(MetricsCollectorProtocol, collector)
|
|
47
|
+
if not container.has(MetricsRecorderProtocol):
|
|
48
|
+
container.singleton(MetricsRecorderProtocol, collector)
|
|
49
|
+
if not container.has(MetricsFactoryProtocol):
|
|
50
|
+
container.singleton(MetricsFactoryProtocol, collector)
|
|
51
|
+
|
|
52
|
+
if not container.has(TracerProtocol):
|
|
53
|
+
container.singleton(TracerProtocol, NoOpTracer())
|
|
54
|
+
|
|
55
|
+
registry = NoOpHealthCheckRegistry()
|
|
56
|
+
if not container.has(HealthCheckRegistryProtocol):
|
|
57
|
+
container.singleton(HealthCheckRegistryProtocol, registry)
|
|
58
|
+
if not container.has(HealthCheckProtocol):
|
|
59
|
+
container.singleton(HealthCheckProtocol, registry)
|
|
60
|
+
|
|
61
|
+
async def boot(self, container: ContainerResolverProtocol) -> None:
|
|
62
|
+
"""No boot-time work is required."""
|
|
63
|
+
|
|
64
|
+
async def shutdown(self) -> None:
|
|
65
|
+
"""No resources need teardown."""
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
__all__ = ["ObservabilityProvider"]
|
|
@@ -200,6 +200,7 @@ class TestObservabilityProvider:
|
|
|
200
200
|
|
|
201
201
|
provider = ObservabilityProvider()
|
|
202
202
|
container = MagicMock()
|
|
203
|
+
container.has.return_value = False
|
|
203
204
|
await provider.register(container)
|
|
204
205
|
|
|
205
206
|
bound_abstracts = [c.args[0] for c in container.singleton.call_args_list]
|
|
@@ -224,6 +225,7 @@ class TestObservabilityProvider:
|
|
|
224
225
|
return None
|
|
225
226
|
|
|
226
227
|
container = MagicMock()
|
|
228
|
+
container.has.return_value = False
|
|
227
229
|
container.singleton = capture_singleton
|
|
228
230
|
|
|
229
231
|
await provider.register(container)
|
|
@@ -269,10 +271,53 @@ class TestObservabilityProvider:
|
|
|
269
271
|
|
|
270
272
|
provider = ObservabilityProvider()
|
|
271
273
|
container = MagicMock()
|
|
274
|
+
container.has.return_value = False
|
|
272
275
|
await provider.register(container)
|
|
273
276
|
|
|
274
277
|
assert container.singleton.call_count == 6
|
|
275
278
|
|
|
279
|
+
@pytest.mark.asyncio
|
|
280
|
+
async def test_skips_tokens_a_real_implementation_already_holds(self) -> None:
|
|
281
|
+
"""Fallback bindings must not overwrite an already-registered token.
|
|
282
|
+
|
|
283
|
+
The container keeps the last registration; an unconditional register
|
|
284
|
+
here let composition order decide the winner, and nested module graphs
|
|
285
|
+
can land the no-op *after* a real implementation.
|
|
286
|
+
"""
|
|
287
|
+
from quadkit.observability.di.sub_providers.observability import (
|
|
288
|
+
ObservabilityProvider,
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
provider = ObservabilityProvider()
|
|
292
|
+
container = MagicMock()
|
|
293
|
+
container.has.return_value = True
|
|
294
|
+
await provider.register(container)
|
|
295
|
+
|
|
296
|
+
assert container.singleton.call_count == 0
|
|
297
|
+
|
|
298
|
+
@pytest.mark.asyncio
|
|
299
|
+
async def test_only_missing_tokens_are_filled(self) -> None:
|
|
300
|
+
"""A partially populated container gets the remaining five no-ops."""
|
|
301
|
+
from quadkit.observability.di.sub_providers.observability import (
|
|
302
|
+
ObservabilityProvider,
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
provider = ObservabilityProvider()
|
|
306
|
+
container = MagicMock()
|
|
307
|
+
container.has.side_effect = (
|
|
308
|
+
lambda service_type: service_type is MetricsCollectorProtocol
|
|
309
|
+
)
|
|
310
|
+
await provider.register(container)
|
|
311
|
+
|
|
312
|
+
bound_abstracts = [c.args[0] for c in container.singleton.call_args_list]
|
|
313
|
+
assert bound_abstracts == [
|
|
314
|
+
MetricsRecorderProtocol,
|
|
315
|
+
MetricsFactoryProtocol,
|
|
316
|
+
TracerProtocol,
|
|
317
|
+
HealthCheckRegistryProtocol,
|
|
318
|
+
HealthCheckProtocol,
|
|
319
|
+
]
|
|
320
|
+
|
|
276
321
|
|
|
277
322
|
class TestPackageExports:
|
|
278
323
|
"""Verify the observability package exports the canonical no-op classes."""
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"""No-op observability provider registered by the Quadkit core framework."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from quadkit.contracts.core.di import (
|
|
6
|
-
ContainerRegistrarProtocol,
|
|
7
|
-
ContainerResolverProtocol,
|
|
8
|
-
)
|
|
9
|
-
from quadkit.contracts.core.health import HealthCheckProtocol
|
|
10
|
-
from quadkit.contracts.observability.metrics import (
|
|
11
|
-
HealthCheckRegistryProtocol,
|
|
12
|
-
MetricsCollectorProtocol,
|
|
13
|
-
MetricsFactoryProtocol,
|
|
14
|
-
MetricsRecorderProtocol,
|
|
15
|
-
)
|
|
16
|
-
from quadkit.contracts.observability.tracing import TracerProtocol
|
|
17
|
-
from quadkit.di.provider import Provider, ProviderPriority
|
|
18
|
-
from quadkit.observability.core import (
|
|
19
|
-
NoOpHealthCheckRegistry,
|
|
20
|
-
NoOpMetricsCollector,
|
|
21
|
-
NoOpTracer,
|
|
22
|
-
)
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
class ObservabilityProvider(Provider):
|
|
26
|
-
"""Provides no-op observability bindings for the core framework."""
|
|
27
|
-
|
|
28
|
-
name = "observability"
|
|
29
|
-
priority = ProviderPriority.INFRASTRUCTURE
|
|
30
|
-
|
|
31
|
-
async def register(self, container: ContainerRegistrarProtocol) -> None:
|
|
32
|
-
"""Register the no-op observability implementations."""
|
|
33
|
-
collector = NoOpMetricsCollector()
|
|
34
|
-
container.singleton(MetricsCollectorProtocol, collector)
|
|
35
|
-
container.singleton(MetricsRecorderProtocol, collector)
|
|
36
|
-
container.singleton(MetricsFactoryProtocol, collector)
|
|
37
|
-
|
|
38
|
-
tracer = NoOpTracer()
|
|
39
|
-
container.singleton(TracerProtocol, tracer)
|
|
40
|
-
|
|
41
|
-
registry = NoOpHealthCheckRegistry()
|
|
42
|
-
container.singleton(HealthCheckRegistryProtocol, registry)
|
|
43
|
-
container.singleton(HealthCheckProtocol, registry)
|
|
44
|
-
|
|
45
|
-
async def boot(self, container: ContainerResolverProtocol) -> None:
|
|
46
|
-
"""No boot-time work is required."""
|
|
47
|
-
|
|
48
|
-
async def shutdown(self) -> None:
|
|
49
|
-
"""No resources need teardown."""
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
__all__ = ["ObservabilityProvider"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|