loom-kernel 0.6.0__tar.gz → 0.7.0__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.
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/CHANGELOG.md +98 -0
- loom_kernel-0.7.0/CHANGELOG_RELEASE.md +96 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/PKG-INFO +1 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/pyproject.toml +2 -2
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/bootstrap.py +68 -45
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/config.py +0 -10
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/runner.py +1 -6
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/async_bridge.py +25 -7
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/config.py +3 -1
- loom_kernel-0.7.0/src/loom/core/compiler.py +24 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/__init__.py +6 -0
- loom_kernel-0.7.0/src/loom/core/config/binder.py +100 -0
- loom_kernel-0.7.0/src/loom/core/config/context.py +232 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/keys.py +4 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/config.py +8 -4
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/query.py +11 -14
- loom_kernel-0.7.0/src/loom/core/runner.py +87 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators_step.py +4 -3
- loom_kernel-0.7.0/src/loom/etl/declarative/expr/_predicate.py +103 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/_executor.py +7 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_params.py +2 -2
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/config_loader.py +10 -18
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/core.py +6 -8
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_config.py +8 -7
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/auto.py +36 -43
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/runner.py +37 -55
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_bindings.py +42 -99
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_compiler.py +30 -9
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/phases/build_plan.py +39 -58
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/phases/validate.py +4 -5
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/testing.py +14 -10
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/test_async_runtime.py +2 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/test_bootstrap.py +57 -28
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_config.py +1 -1
- loom_kernel-0.7.0/tests/unit/core/config/test_binder.py +147 -0
- loom_kernel-0.7.0/tests/unit/core/config/test_context.py +115 -0
- loom_kernel-0.7.0/tests/unit/core/repository/abc/test_query.py +108 -0
- loom_kernel-0.7.0/tests/unit/core/test_compiler_contracts.py +27 -0
- loom_kernel-0.7.0/tests/unit/core/test_runner_contracts.py +121 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_config_loader.py +2 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_executor.py +24 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_runner.py +2 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_fastapi_auto_logger.py +19 -8
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/conftest.py +12 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_collect_batch.py +1 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runner.py +70 -20
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_async_walk.py +3 -3
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_basics.py +7 -7
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_config_bindings.py +8 -8
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_multi_source.py +2 -2
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_router.py +4 -4
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_window.py +2 -2
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_with.py +3 -3
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/test_compiler_examples.py +1 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/test_flow_examples.py +4 -4
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/test_broadcast.py +3 -3
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_observability_runner.py +1 -1
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_fork.py +2 -2
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/uv.lock +1 -1
- loom_kernel-0.6.0/CHANGELOG_RELEASE.md +0 -116
- loom_kernel-0.6.0/src/loom/etl/declarative/expr/_predicate.py +0 -174
- loom_kernel-0.6.0/tests/unit/core/repository/abc/test_query.py +0 -44
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/ci-main.yml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/ci-pr.yml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/docs.yml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/release.yml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.gitignore +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.pre-commit-config.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.readthedocs.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/LICENSE +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/Makefile +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/README.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/codecov.yml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/.gitkeep +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/custom.css +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/logo-transparent.png +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/logo.svg +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/adr/README.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/clean-architecture.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/overview.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/conf.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/examples.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/pipelines.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/testing.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/examples-repo/index.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/etl.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/rest.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/streaming.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/autocrud.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/celery.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/etl.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/fake-repo-examples.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/quickstart.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/use-case-dsl.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/index.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/overview.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/core.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/etl.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/repository.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/rest.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/streaming.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/testing.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/index.rst +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/requirements.txt +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/autocrud.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/celery.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/examples.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/testing.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/use-case-dsl.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/streaming/bytewax.md +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/sonar-project.properties +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/runner.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/baselines/.gitkeep +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/outputs/.gitkeep +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/plans/.gitkeep +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/helpers/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/bootstrap/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/etl/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/etl/test_runner_integration.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/main.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/manifest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/interface.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/jobs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/relations.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/schemas.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/support/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_auto.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_runner.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/backend/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/cache/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_base.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_field.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_patch.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_introspection.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/test_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/test_configurable.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/di/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/di/test_container.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/discovery/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/discovery/test_manifest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_metrics.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_plan.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/errors/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/errors/test_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/expr/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/expr/test_expr.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_callback.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_context.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_handle.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_inline_service.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_job.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/test_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/test_registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_struct.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_timestamped.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/test_observers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/test_runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/projection/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/projection/test_runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/routing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/routing/test_routing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/test_async_bridge.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/tracing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/tracing/test_context.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_compute.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_factory.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_invoker.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_markers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_rule.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_use_case.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_structural.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_history_target.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source_json.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source_options.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_target.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_utils.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_variants.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_observer.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_records.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_store.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_step.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_contract.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_schema.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_table.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_merge.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_predicate.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_locator.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_route_build.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_format_registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_module_contracts.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_runner_errors.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_spark_testing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_runners.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/test_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/test_middleware.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_autocrud.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_middleware.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_response.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_compiler.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_model.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_router_runtime.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_adapter.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_message.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/router.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/fakes.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_client.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_config.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_message.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/conftest.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_registry.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/support/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/support/flow_cases.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_otel_observability.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_routing.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_with.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/__init__.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_golden.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_http_harness.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_in_memory.py +0 -0
- {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_runner.py +0 -0
|
@@ -1,3 +1,101 @@
|
|
|
1
|
+
# 🚀 Release 0.7.0 ([#25](https://github.com/the-reacher-data/loom-py/pull/25)) ([`0d8941a`](https://github.com/the-reacher-data/loom-py/commit/0d8941a724ec768b162a07e756bac3d53157ec85))
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## ✨ Features
|
|
5
|
+
### config
|
|
6
|
+
- **config:** add StructBinder and migrate streaming binding resolution<br>
|
|
7
|
+
> Introduces StructBinder in core/config/binder.py — a Strategy that
|
|
8
|
+
> injects constructor arguments from a config mapping via msgspec.convert,
|
|
9
|
+
> covering primitives, Literal constraints, and LoomFrozenStruct subclasses.
|
|
10
|
+
> Migrates streaming _instantiate_binding to use it, removing ~30 lines of
|
|
11
|
+
> private helpers and adding typed ConfigError on resolution failures.
|
|
12
|
+
|
|
13
|
+
- **config:** add ConfigContext for typed section extraction and binding resolution<br>
|
|
14
|
+
> Single entry-point for runner and bootstrap code to read config:
|
|
15
|
+
> section() extracts typed sub-trees, bind() injects constructor args
|
|
16
|
+
> from a config path + overrides, resolve() materializes ConfigBinding
|
|
17
|
+
> declarations. Accepts an optional StructBinder for strict-mode control.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## 🐛 Fixes
|
|
22
|
+
### core
|
|
23
|
+
- **core:** clean async bridge timeout and celery typing
|
|
24
|
+
|
|
25
|
+
### etl
|
|
26
|
+
- **etl:** align missing storage error with config contract
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## ♻️ Refactor
|
|
32
|
+
### model
|
|
33
|
+
- **model:** migrate public config structs to LoomFrozenStruct
|
|
34
|
+
|
|
35
|
+
### streaming
|
|
36
|
+
- **streaming:** clean up _instantiate_binding before extraction<br>
|
|
37
|
+
> Replace mutable dict() + .update() with a single dict unpacking
|
|
38
|
+
> Remove the dead param.annotation fallback (get_type_hints already
|
|
39
|
+
> resolves all forward refs; the fallback silently passed strings to
|
|
40
|
+
> _is_struct_annotation which always returned False)
|
|
41
|
+
> Extract _SKIP_KINDS constant to name the variadic-parameter guard
|
|
42
|
+
> Raise ConfigError instead of TypeError for missing required struct
|
|
43
|
+
> params (semantically a config error, not a type error; both are
|
|
44
|
+
> caught by the enclosing _resolve_binding handler so no behaviour
|
|
45
|
+
> change in streaming)
|
|
46
|
+
> All 7 binding tests pass.
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### core
|
|
50
|
+
- **core:** homogenize config and runner boundaries
|
|
51
|
+
- **core:** add runner and compiler protocols
|
|
52
|
+
- **core:** apply runner lifecycle protocols
|
|
53
|
+
- **core:** harden runner lifecycle abstraction<br>
|
|
54
|
+
> shutdown_runner/flush_runner now catch and log exceptions instead of
|
|
55
|
+
> propagating, preserving the original exception when called from finally
|
|
56
|
+
> blocks; contract updated in docstrings and covered by new tests
|
|
57
|
+
> CompilerProtocol drops @runtime_checkable — no production isinstance
|
|
58
|
+
> usage existed; Protocol remains valid for static typing
|
|
59
|
+
> StreamingRunner.prepare_run() calls shutdown_runner(self) before
|
|
60
|
+
> overwriting self._shutdown, preventing resource leaks on double calls
|
|
61
|
+
> _build_backend_options extracted from loom.celery.config into
|
|
62
|
+
> loom.core.async_bridge.build_backend_options, eliminating duplication
|
|
63
|
+
> between the Celery and streaming domains
|
|
64
|
+
> _CeleryAsyncRuntime._signals_connected ClassVar removed; the
|
|
65
|
+
> module-level _SIGNALS_CONNECTED flag is the single source of truth
|
|
66
|
+
> for the process-level signal guard
|
|
67
|
+
> ETLRunner.flush() delegates to ETLExecutor.flush(), which checks
|
|
68
|
+
> SupportsFlush via isinstance instead of getattr duck-typing
|
|
69
|
+
> TypeVars in compiler.py renamed to _RequestT/_PlanT to signal they
|
|
70
|
+
> are implementation details of the Protocol, not public API
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### etl
|
|
74
|
+
- **etl:** make flush an optional runner capability
|
|
75
|
+
|
|
76
|
+
### celery
|
|
77
|
+
- **celery:** adopt runner shutdown helper
|
|
78
|
+
- **celery:** replace _SIGNALS_CONNECTED sentinel with dispatch_uid<br>
|
|
79
|
+
> Eliminates the module-level mutable boolean that violated the no-global-
|
|
80
|
+
> mutable-state architecture rule. Idempotency is now handled by Celery's
|
|
81
|
+
> dispatch_uid mechanism: disconnect+connect on each call ensures the most-
|
|
82
|
+
> recently registered closure is always active, so a second bootstrap_worker
|
|
83
|
+
> call wires up fresh dependencies rather than leaving stale closures from
|
|
84
|
+
> the first call.
|
|
85
|
+
> This is strictly better than the sentinel: no global state, no race
|
|
86
|
+
> condition between threads calling bootstrap_worker concurrently, and
|
|
87
|
+
> correct closure replacement when called multiple times in tests.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
### rest
|
|
91
|
+
- **rest:** use observability config directly
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
|
|
1
99
|
# 🚀 Release 0.6.0 ([#22](https://github.com/the-reacher-data/loom-py/pull/22)) ([`5146569`](https://github.com/the-reacher-data/loom-py/commit/51465697115036ed05f620a1099272e4fd216501))
|
|
2
100
|
|
|
3
101
|
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# 🚀 Release 0.7.0 ([#25](https://github.com/the-reacher-data/loom-py/pull/25)) ([`0d8941a`](https://github.com/the-reacher-data/loom-py/commit/0d8941a724ec768b162a07e756bac3d53157ec85))
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
## ✨ Features
|
|
5
|
+
### config
|
|
6
|
+
- **config:** add StructBinder and migrate streaming binding resolution<br>
|
|
7
|
+
> Introduces StructBinder in core/config/binder.py — a Strategy that
|
|
8
|
+
> injects constructor arguments from a config mapping via msgspec.convert,
|
|
9
|
+
> covering primitives, Literal constraints, and LoomFrozenStruct subclasses.
|
|
10
|
+
> Migrates streaming _instantiate_binding to use it, removing ~30 lines of
|
|
11
|
+
> private helpers and adding typed ConfigError on resolution failures.
|
|
12
|
+
|
|
13
|
+
- **config:** add ConfigContext for typed section extraction and binding resolution<br>
|
|
14
|
+
> Single entry-point for runner and bootstrap code to read config:
|
|
15
|
+
> section() extracts typed sub-trees, bind() injects constructor args
|
|
16
|
+
> from a config path + overrides, resolve() materializes ConfigBinding
|
|
17
|
+
> declarations. Accepts an optional StructBinder for strict-mode control.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## 🐛 Fixes
|
|
22
|
+
### core
|
|
23
|
+
- **core:** clean async bridge timeout and celery typing
|
|
24
|
+
|
|
25
|
+
### etl
|
|
26
|
+
- **etl:** align missing storage error with config contract
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## ♻️ Refactor
|
|
32
|
+
### model
|
|
33
|
+
- **model:** migrate public config structs to LoomFrozenStruct
|
|
34
|
+
|
|
35
|
+
### streaming
|
|
36
|
+
- **streaming:** clean up _instantiate_binding before extraction<br>
|
|
37
|
+
> Replace mutable dict() + .update() with a single dict unpacking
|
|
38
|
+
> Remove the dead param.annotation fallback (get_type_hints already
|
|
39
|
+
> resolves all forward refs; the fallback silently passed strings to
|
|
40
|
+
> _is_struct_annotation which always returned False)
|
|
41
|
+
> Extract _SKIP_KINDS constant to name the variadic-parameter guard
|
|
42
|
+
> Raise ConfigError instead of TypeError for missing required struct
|
|
43
|
+
> params (semantically a config error, not a type error; both are
|
|
44
|
+
> caught by the enclosing _resolve_binding handler so no behaviour
|
|
45
|
+
> change in streaming)
|
|
46
|
+
> All 7 binding tests pass.
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
### core
|
|
50
|
+
- **core:** homogenize config and runner boundaries
|
|
51
|
+
- **core:** add runner and compiler protocols
|
|
52
|
+
- **core:** apply runner lifecycle protocols
|
|
53
|
+
- **core:** harden runner lifecycle abstraction<br>
|
|
54
|
+
> shutdown_runner/flush_runner now catch and log exceptions instead of
|
|
55
|
+
> propagating, preserving the original exception when called from finally
|
|
56
|
+
> blocks; contract updated in docstrings and covered by new tests
|
|
57
|
+
> CompilerProtocol drops @runtime_checkable — no production isinstance
|
|
58
|
+
> usage existed; Protocol remains valid for static typing
|
|
59
|
+
> StreamingRunner.prepare_run() calls shutdown_runner(self) before
|
|
60
|
+
> overwriting self._shutdown, preventing resource leaks on double calls
|
|
61
|
+
> _build_backend_options extracted from loom.celery.config into
|
|
62
|
+
> loom.core.async_bridge.build_backend_options, eliminating duplication
|
|
63
|
+
> between the Celery and streaming domains
|
|
64
|
+
> _CeleryAsyncRuntime._signals_connected ClassVar removed; the
|
|
65
|
+
> module-level _SIGNALS_CONNECTED flag is the single source of truth
|
|
66
|
+
> for the process-level signal guard
|
|
67
|
+
> ETLRunner.flush() delegates to ETLExecutor.flush(), which checks
|
|
68
|
+
> SupportsFlush via isinstance instead of getattr duck-typing
|
|
69
|
+
> TypeVars in compiler.py renamed to _RequestT/_PlanT to signal they
|
|
70
|
+
> are implementation details of the Protocol, not public API
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### etl
|
|
74
|
+
- **etl:** make flush an optional runner capability
|
|
75
|
+
|
|
76
|
+
### celery
|
|
77
|
+
- **celery:** adopt runner shutdown helper
|
|
78
|
+
- **celery:** replace _SIGNALS_CONNECTED sentinel with dispatch_uid<br>
|
|
79
|
+
> Eliminates the module-level mutable boolean that violated the no-global-
|
|
80
|
+
> mutable-state architecture rule. Idempotency is now handled by Celery's
|
|
81
|
+
> dispatch_uid mechanism: disconnect+connect on each call ensures the most-
|
|
82
|
+
> recently registered closure is always active, so a second bootstrap_worker
|
|
83
|
+
> call wires up fresh dependencies rather than leaving stale closures from
|
|
84
|
+
> the first call.
|
|
85
|
+
> This is strictly better than the sentinel: no global state, no race
|
|
86
|
+
> condition between threads calling bootstrap_worker concurrently, and
|
|
87
|
+
> correct closure replacement when called multiple times in tests.
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
### rest
|
|
91
|
+
- **rest:** use observability config directly
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "loom-kernel"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "0.7.0"
|
|
4
4
|
description = "Loom Python project"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.11"
|
|
@@ -220,7 +220,7 @@ markers = [
|
|
|
220
220
|
|
|
221
221
|
[tool.commitizen]
|
|
222
222
|
name = "cz_conventional_commits"
|
|
223
|
-
version = "0.
|
|
223
|
+
version = "0.7.0"
|
|
224
224
|
tag_format = "v$version"
|
|
225
225
|
version_files = [
|
|
226
226
|
"pyproject.toml:project.version",
|
|
@@ -6,7 +6,7 @@ registration:
|
|
|
6
6
|
|
|
7
7
|
1. Load and merge YAML configuration.
|
|
8
8
|
2. Create :class:`~loom.core.di.container.LoomContainer` and register the
|
|
9
|
-
|
|
9
|
+
resolved app config as an ``APPLICATION``-scope singleton.
|
|
10
10
|
3. Execute user-supplied module callables.
|
|
11
11
|
4. Compile all declared ``Job`` subclasses via
|
|
12
12
|
:class:`~loom.core.engine.compiler.UseCaseCompiler`.
|
|
@@ -54,9 +54,9 @@ from __future__ import annotations
|
|
|
54
54
|
|
|
55
55
|
import importlib
|
|
56
56
|
import inspect
|
|
57
|
-
from collections.abc import Callable, Sequence
|
|
57
|
+
from collections.abc import Callable, Mapping, Sequence
|
|
58
58
|
from dataclasses import dataclass, field
|
|
59
|
-
from typing import
|
|
59
|
+
from typing import Any, Literal, Protocol, TypeVar
|
|
60
60
|
|
|
61
61
|
import msgspec
|
|
62
62
|
from celery import Celery # type: ignore[import-untyped]
|
|
@@ -69,7 +69,6 @@ from loom.celery.config import (
|
|
|
69
69
|
CeleryConfig,
|
|
70
70
|
CeleryRuntimeConfig,
|
|
71
71
|
JobConfig,
|
|
72
|
-
_build_backend_options,
|
|
73
72
|
apply_job_config,
|
|
74
73
|
create_celery_app,
|
|
75
74
|
)
|
|
@@ -80,14 +79,15 @@ from loom.celery.runner import (
|
|
|
80
79
|
_make_callback_task,
|
|
81
80
|
_make_job_task,
|
|
82
81
|
)
|
|
82
|
+
from loom.core.async_bridge import build_backend_options
|
|
83
83
|
from loom.core.backend.sqlalchemy import compile_all, reset_registry
|
|
84
84
|
from loom.core.bootstrap import create_kernel
|
|
85
|
+
from loom.core.config import ConfigContext, ConfigKey
|
|
85
86
|
from loom.core.config.errors import ConfigError
|
|
86
|
-
from loom.core.config.keys import ConfigKey
|
|
87
|
-
from loom.core.config.loader import load_config, section
|
|
88
87
|
from loom.core.di.container import LoomContainer
|
|
89
88
|
from loom.core.discovery._utils import collect_from_modules, import_modules
|
|
90
89
|
from loom.core.engine.compilable import Compilable
|
|
90
|
+
from loom.core.engine.metrics import MetricsAdapter
|
|
91
91
|
from loom.core.job.job import Job
|
|
92
92
|
from loom.core.model import BaseModel
|
|
93
93
|
from loom.core.observability.config import ObservabilityConfig
|
|
@@ -95,15 +95,11 @@ from loom.core.observability.runtime import ObservabilityRuntime
|
|
|
95
95
|
from loom.core.repository.sqlalchemy import build_sqlalchemy_repository_registration_module
|
|
96
96
|
from loom.core.repository.sqlalchemy.session_manager import SessionManager
|
|
97
97
|
from loom.core.repository.sqlalchemy.uow import SQLAlchemyUnitOfWorkFactory
|
|
98
|
+
from loom.core.runner import shutdown_runner
|
|
98
99
|
from loom.core.uow.abc import UnitOfWorkFactory
|
|
99
100
|
from loom.core.use_case.factory import UseCaseFactory
|
|
100
101
|
from loom.rest.autocrud import build_auto_routes
|
|
101
102
|
|
|
102
|
-
if TYPE_CHECKING:
|
|
103
|
-
from omegaconf import DictConfig
|
|
104
|
-
|
|
105
|
-
from loom.core.engine.metrics import MetricsAdapter
|
|
106
|
-
|
|
107
103
|
_T = TypeVar("_T")
|
|
108
104
|
|
|
109
105
|
|
|
@@ -203,22 +199,30 @@ class _WorkerResolved:
|
|
|
203
199
|
# Celery worker lifecycle signals
|
|
204
200
|
# ---------------------------------------------------------------------------
|
|
205
201
|
|
|
202
|
+
_WORKER_INIT_UID = "loom.celery.worker.init"
|
|
203
|
+
_WORKER_SHUTDOWN_UID = "loom.celery.worker.shutdown"
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class _AsyncRuntimeProtocol(Protocol):
|
|
207
|
+
def initialize(self) -> None: ...
|
|
208
|
+
|
|
209
|
+
def run(self, coro: Any, *, eager_fallback: bool) -> Any: ...
|
|
206
210
|
|
|
207
|
-
|
|
211
|
+
def shutdown(self) -> None: ...
|
|
208
212
|
|
|
209
213
|
|
|
210
214
|
def _build_async_runtime(runtime_cfg: CeleryRuntimeConfig) -> _CeleryAsyncRuntime:
|
|
211
215
|
"""Build the per-process async runtime used by Celery worker tasks."""
|
|
212
216
|
return _CeleryAsyncRuntime(
|
|
213
217
|
backend=runtime_cfg.backend,
|
|
214
|
-
backend_options=
|
|
218
|
+
backend_options=build_backend_options(runtime_cfg.backend, runtime_cfg.use_uvloop),
|
|
215
219
|
shutdown_timeout_ms=runtime_cfg.shutdown_timeout_ms,
|
|
216
220
|
)
|
|
217
221
|
|
|
218
222
|
|
|
219
223
|
def _connect_worker_signals(
|
|
220
224
|
session_manager: SessionManager | None,
|
|
221
|
-
async_runtime:
|
|
225
|
+
async_runtime: _AsyncRuntimeProtocol,
|
|
222
226
|
) -> None:
|
|
223
227
|
"""Connect Celery worker lifecycle signals for per-process bridge management.
|
|
224
228
|
|
|
@@ -229,9 +233,12 @@ def _connect_worker_signals(
|
|
|
229
233
|
* ``worker_process_shutdown`` — disposes the session manager through
|
|
230
234
|
the bridge, then shuts it down.
|
|
231
235
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
called more than once (e.g. in
|
|
236
|
+
Idempotency is guaranteed by ``dispatch_uid``: subsequent calls replace
|
|
237
|
+
the active closures rather than accumulating handlers. This means that
|
|
238
|
+
when :func:`bootstrap_worker` is called more than once (e.g. in
|
|
239
|
+
integration tests), the most-recently registered ``session_manager`` and
|
|
240
|
+
``async_runtime`` are always the ones used at shutdown — no stale
|
|
241
|
+
closures remain active.
|
|
235
242
|
|
|
236
243
|
Args:
|
|
237
244
|
session_manager: The shared :class:`~SessionManager` instance
|
|
@@ -239,9 +246,6 @@ def _connect_worker_signals(
|
|
|
239
246
|
on shutdown when present.
|
|
240
247
|
async_runtime: Per-process async bridge runtime used for async jobs.
|
|
241
248
|
"""
|
|
242
|
-
global _SIGNALS_CONNECTED
|
|
243
|
-
if _SIGNALS_CONNECTED:
|
|
244
|
-
return
|
|
245
249
|
|
|
246
250
|
def _on_init(**kwargs: Any) -> None:
|
|
247
251
|
async_runtime.initialize()
|
|
@@ -259,21 +263,24 @@ def _connect_worker_signals(
|
|
|
259
263
|
close()
|
|
260
264
|
raise
|
|
261
265
|
finally:
|
|
262
|
-
async_runtime
|
|
266
|
+
shutdown_runner(async_runtime)
|
|
263
267
|
|
|
264
|
-
worker_process_init.
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
+
worker_process_init.disconnect(dispatch_uid=_WORKER_INIT_UID)
|
|
269
|
+
worker_process_init.connect(_on_init, weak=False, dispatch_uid=_WORKER_INIT_UID)
|
|
270
|
+
worker_process_shutdown.disconnect(dispatch_uid=_WORKER_SHUTDOWN_UID)
|
|
271
|
+
worker_process_shutdown.connect(_on_shutdown, weak=False, dispatch_uid=_WORKER_SHUTDOWN_UID)
|
|
268
272
|
|
|
269
273
|
|
|
270
|
-
def _resolve_uow_factory(
|
|
274
|
+
def _resolve_uow_factory(
|
|
275
|
+
ctx: ConfigContext | Mapping[str, Any],
|
|
276
|
+
) -> tuple[UnitOfWorkFactory | None, SessionManager | None]:
|
|
271
277
|
"""Return SQLAlchemy UoW factory when database config is present.
|
|
272
278
|
|
|
273
279
|
This keeps worker bootstrap lightweight for pure jobs that do not use DB.
|
|
274
280
|
"""
|
|
281
|
+
config = _ensure_config_context(ctx)
|
|
275
282
|
try:
|
|
276
|
-
db_cfg = section(
|
|
283
|
+
db_cfg = config.section(ConfigKey.DATABASE, _WorkerDbConfig)
|
|
277
284
|
except ConfigError:
|
|
278
285
|
return None, None
|
|
279
286
|
|
|
@@ -291,19 +298,22 @@ def _resolve_uow_factory(raw: DictConfig) -> tuple[UnitOfWorkFactory | None, Ses
|
|
|
291
298
|
# ---------------------------------------------------------------------------
|
|
292
299
|
|
|
293
300
|
|
|
294
|
-
def _apply_job_config_if_present(
|
|
301
|
+
def _apply_job_config_if_present(
|
|
302
|
+
ctx: ConfigContext | Mapping[str, Any],
|
|
303
|
+
job_type: type[Job[Any]],
|
|
304
|
+
) -> None:
|
|
295
305
|
"""Apply ``JobConfig`` overrides from YAML to ``job_type``'s ClassVars.
|
|
296
306
|
|
|
297
307
|
Silently skips when the ``jobs.<JobTypeName>`` section is absent — the
|
|
298
308
|
Job's ClassVar defaults remain unchanged.
|
|
299
309
|
|
|
300
310
|
Args:
|
|
301
|
-
|
|
302
|
-
:func:`~loom.core.config.loader.load_config`.
|
|
311
|
+
ctx: Resolved configuration context.
|
|
303
312
|
job_type: Concrete ``Job`` subclass to configure.
|
|
304
313
|
"""
|
|
314
|
+
config = _ensure_config_context(ctx)
|
|
305
315
|
try:
|
|
306
|
-
cfg = section(
|
|
316
|
+
cfg = config.section(f"{ConfigKey.JOBS}.{job_type.__name__}", JobConfig)
|
|
307
317
|
apply_job_config(job_type, cfg)
|
|
308
318
|
except ConfigError:
|
|
309
319
|
pass # no override for this job — use ClassVar defaults
|
|
@@ -524,25 +534,27 @@ def _discover_compilables_from_config(
|
|
|
524
534
|
return _discover_from_manifest(discovery_cfg)
|
|
525
535
|
|
|
526
536
|
|
|
527
|
-
def _try_discover_components(
|
|
537
|
+
def _try_discover_components(ctx: ConfigContext | Mapping[str, Any]) -> _WorkerResolved:
|
|
528
538
|
"""Best-effort discovery; returns empty _WorkerResolved if config is absent."""
|
|
539
|
+
config = _ensure_config_context(ctx)
|
|
529
540
|
try:
|
|
530
|
-
app_cfg = section(
|
|
541
|
+
app_cfg = config.section(ConfigKey.APP, _WorkerAppConfig)
|
|
531
542
|
return _discover_compilables_from_config(app_cfg.discovery)
|
|
532
543
|
except (ConfigError, RuntimeError, ValueError, TypeError):
|
|
533
544
|
return _WorkerResolved(compilables=(), jobs=(), models=(), callbacks=())
|
|
534
545
|
|
|
535
546
|
|
|
536
547
|
def _resolve_compilables_and_jobs(
|
|
537
|
-
|
|
548
|
+
ctx: ConfigContext | Mapping[str, Any],
|
|
538
549
|
explicit_jobs: Sequence[type[Job[Any]]],
|
|
539
550
|
explicit_use_cases: Sequence[type[Compilable]],
|
|
540
551
|
) -> _WorkerResolved:
|
|
541
552
|
"""Resolve worker components from explicit args and/or discovery config."""
|
|
553
|
+
config = _ensure_config_context(ctx)
|
|
542
554
|
if explicit_jobs or explicit_use_cases:
|
|
543
555
|
jobs = tuple(explicit_jobs)
|
|
544
556
|
compilables = _merge_unique(explicit_use_cases, jobs)
|
|
545
|
-
discovered = _try_discover_components(
|
|
557
|
+
discovered = _try_discover_components(config)
|
|
546
558
|
extra = tuple(c for c in discovered.compilables if c not in set(compilables))
|
|
547
559
|
return _WorkerResolved(
|
|
548
560
|
compilables=(*compilables, *extra),
|
|
@@ -552,7 +564,7 @@ def _resolve_compilables_and_jobs(
|
|
|
552
564
|
)
|
|
553
565
|
|
|
554
566
|
try:
|
|
555
|
-
app_cfg = section(
|
|
567
|
+
app_cfg = config.section(ConfigKey.APP, _WorkerAppConfig)
|
|
556
568
|
except ConfigError as exc:
|
|
557
569
|
raise RuntimeError(
|
|
558
570
|
"No jobs provided and no app.discovery configured for worker bootstrap."
|
|
@@ -594,10 +606,13 @@ def _compile_models(models: Sequence[type[BaseModel]]) -> tuple[type[BaseModel],
|
|
|
594
606
|
# ---------------------------------------------------------------------------
|
|
595
607
|
|
|
596
608
|
|
|
597
|
-
def _build_observability_runtime(
|
|
609
|
+
def _build_observability_runtime(
|
|
610
|
+
ctx: ConfigContext | Mapping[str, Any],
|
|
611
|
+
) -> ObservabilityRuntime:
|
|
598
612
|
"""Build the shared observability runtime from top-level config."""
|
|
613
|
+
config = _ensure_config_context(ctx)
|
|
599
614
|
try:
|
|
600
|
-
observability_cfg = section(
|
|
615
|
+
observability_cfg = config.section(ConfigKey.OBSERVABILITY, ObservabilityConfig)
|
|
601
616
|
except ConfigError:
|
|
602
617
|
observability_cfg = ObservabilityConfig()
|
|
603
618
|
return ObservabilityRuntime.from_config(observability_cfg)
|
|
@@ -642,6 +657,13 @@ def _emit_worker_init_graph(components: _WorkerResolved) -> None:
|
|
|
642
657
|
)
|
|
643
658
|
|
|
644
659
|
|
|
660
|
+
def _ensure_config_context(source: ConfigContext | Mapping[str, Any]) -> ConfigContext:
|
|
661
|
+
"""Return a :class:`ConfigContext` for any supported config input."""
|
|
662
|
+
if isinstance(source, ConfigContext):
|
|
663
|
+
return source
|
|
664
|
+
return ConfigContext.from_dict(source)
|
|
665
|
+
|
|
666
|
+
|
|
645
667
|
# ---------------------------------------------------------------------------
|
|
646
668
|
# Result
|
|
647
669
|
# ---------------------------------------------------------------------------
|
|
@@ -750,21 +772,22 @@ def bootstrap_worker(
|
|
|
750
772
|
)
|
|
751
773
|
result.celery_app.start()
|
|
752
774
|
"""
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
775
|
+
ctx = ConfigContext.from_yaml(*config_paths)
|
|
776
|
+
app_cfg = ctx.section_optional(ConfigKey.APP, _WorkerAppConfig) or _WorkerAppConfig()
|
|
777
|
+
celery_cfg = ctx.section(ConfigKey.CELERY, CeleryConfig)
|
|
778
|
+
observability_runtime = _build_observability_runtime(ctx)
|
|
756
779
|
async_runtime = _build_async_runtime(celery_cfg.runtime)
|
|
757
780
|
|
|
758
|
-
resolved = _resolve_compilables_and_jobs(
|
|
781
|
+
resolved = _resolve_compilables_and_jobs(ctx, jobs, use_cases)
|
|
759
782
|
all_compilables = _merge_unique(
|
|
760
783
|
resolved.compilables,
|
|
761
784
|
_use_cases_from_interfaces(interfaces),
|
|
762
785
|
)
|
|
763
786
|
|
|
764
787
|
for job_type in resolved.jobs:
|
|
765
|
-
_apply_job_config_if_present(
|
|
788
|
+
_apply_job_config_if_present(ctx, job_type)
|
|
766
789
|
|
|
767
|
-
uow_factory, session_manager = _resolve_uow_factory(
|
|
790
|
+
uow_factory, session_manager = _resolve_uow_factory(ctx)
|
|
768
791
|
final_models, runtime_modules = _compile_db_layer(session_manager, resolved.models, modules)
|
|
769
792
|
|
|
770
793
|
resolved = _WorkerResolved(
|
|
@@ -776,7 +799,7 @@ def bootstrap_worker(
|
|
|
776
799
|
_emit_worker_init_graph(resolved)
|
|
777
800
|
|
|
778
801
|
kernel = create_kernel(
|
|
779
|
-
config=
|
|
802
|
+
config=app_cfg,
|
|
780
803
|
use_cases=resolved.compilables,
|
|
781
804
|
modules=runtime_modules,
|
|
782
805
|
metrics=metrics,
|
|
@@ -30,7 +30,6 @@ Typical YAML layout::
|
|
|
30
30
|
|
|
31
31
|
from __future__ import annotations
|
|
32
32
|
|
|
33
|
-
import sys
|
|
34
33
|
from typing import TYPE_CHECKING, Any, Literal
|
|
35
34
|
|
|
36
35
|
import msgspec
|
|
@@ -172,15 +171,6 @@ def apply_job_config(job_type: type[Job[Any]], cfg: JobConfig) -> None:
|
|
|
172
171
|
setattr(job_type, class_var, value)
|
|
173
172
|
|
|
174
173
|
|
|
175
|
-
def _build_backend_options(backend: str, use_uvloop: bool) -> dict[str, Any]:
|
|
176
|
-
"""Return AnyIO backend options for an async bridge."""
|
|
177
|
-
if backend == "asyncio" and use_uvloop and sys.platform != "win32":
|
|
178
|
-
import uvloop # guarded by sys_platform marker in pyproject.toml
|
|
179
|
-
|
|
180
|
-
return {"loop_factory": uvloop.new_event_loop}
|
|
181
|
-
return {}
|
|
182
|
-
|
|
183
|
-
|
|
184
174
|
def create_celery_app(cfg: CeleryConfig) -> Celery:
|
|
185
175
|
"""Build a Celery application from a ``CeleryConfig``.
|
|
186
176
|
|
|
@@ -25,7 +25,7 @@ import inspect
|
|
|
25
25
|
import time
|
|
26
26
|
from contextvars import Token
|
|
27
27
|
from dataclasses import dataclass, field
|
|
28
|
-
from typing import TYPE_CHECKING, Any
|
|
28
|
+
from typing import TYPE_CHECKING, Any
|
|
29
29
|
|
|
30
30
|
from celery import Celery # type: ignore[import-untyped]
|
|
31
31
|
from celery.result import AsyncResult # type: ignore[import-untyped]
|
|
@@ -49,11 +49,6 @@ if TYPE_CHECKING:
|
|
|
49
49
|
class _CeleryAsyncRuntime:
|
|
50
50
|
"""Per-process async bridge for Celery worker coroutines."""
|
|
51
51
|
|
|
52
|
-
# Class-level guard: signals must be connected exactly once per process.
|
|
53
|
-
# Stored on the class (not the instance) because it reflects process state,
|
|
54
|
-
# not a property of any particular runtime object.
|
|
55
|
-
_signals_connected: ClassVar[bool] = False
|
|
56
|
-
|
|
57
52
|
backend: str = "asyncio"
|
|
58
53
|
backend_options: dict[str, Any] = field(default_factory=dict)
|
|
59
54
|
shutdown_timeout_ms: int | None = None
|
|
@@ -28,6 +28,7 @@ Thread safety:
|
|
|
28
28
|
from __future__ import annotations
|
|
29
29
|
|
|
30
30
|
import logging
|
|
31
|
+
import sys
|
|
31
32
|
import threading
|
|
32
33
|
from collections.abc import Coroutine
|
|
33
34
|
from typing import Any, TypeVar, cast
|
|
@@ -39,6 +40,23 @@ logger = logging.getLogger(__name__)
|
|
|
39
40
|
T = TypeVar("T")
|
|
40
41
|
|
|
41
42
|
|
|
43
|
+
def build_backend_options(backend: str, use_uvloop: bool) -> dict[str, Any]:
|
|
44
|
+
"""Build AnyIO backend options for the shared async bridge contract.
|
|
45
|
+
|
|
46
|
+
Args:
|
|
47
|
+
backend: AnyIO backend name.
|
|
48
|
+
use_uvloop: Whether asyncio should use uvloop when available.
|
|
49
|
+
|
|
50
|
+
Returns:
|
|
51
|
+
A backend-options mapping suitable for :class:`AsyncBridge`.
|
|
52
|
+
"""
|
|
53
|
+
if backend == "asyncio" and use_uvloop and sys.platform != "win32":
|
|
54
|
+
import uvloop # guarded by sys_platform marker in pyproject.toml
|
|
55
|
+
|
|
56
|
+
return {"loop_factory": uvloop.new_event_loop}
|
|
57
|
+
return {}
|
|
58
|
+
|
|
59
|
+
|
|
42
60
|
class AsyncBridge:
|
|
43
61
|
"""Anyio blocking portal wrapper for sync-to-async execution.
|
|
44
62
|
|
|
@@ -94,8 +112,13 @@ class AsyncBridge:
|
|
|
94
112
|
if self._closed:
|
|
95
113
|
coro.close()
|
|
96
114
|
raise RuntimeError("AsyncBridge has been shut down.")
|
|
115
|
+
|
|
116
|
+
async def _await_coro_with_timeout() -> T:
|
|
117
|
+
with anyio.fail_after(timeout):
|
|
118
|
+
return await coro
|
|
119
|
+
|
|
97
120
|
if timeout is not None:
|
|
98
|
-
return
|
|
121
|
+
return self._portal.call(_await_coro_with_timeout)
|
|
99
122
|
return cast(T, self._portal.call(_await_coro, coro))
|
|
100
123
|
|
|
101
124
|
@property
|
|
@@ -139,11 +162,6 @@ async def _await_coro(coro: Coroutine[Any, Any, T]) -> T:
|
|
|
139
162
|
return await coro
|
|
140
163
|
|
|
141
164
|
|
|
142
|
-
async def _await_with_timeout(coro: Coroutine[Any, Any, T], timeout: float) -> T: # noqa: S7483
|
|
143
|
-
with anyio.fail_after(timeout):
|
|
144
|
-
return await coro
|
|
145
|
-
|
|
146
|
-
|
|
147
165
|
AsyncWorker = AsyncBridge
|
|
148
166
|
|
|
149
|
-
__all__ = ["AsyncBridge", "AsyncWorker"]
|
|
167
|
+
__all__ = ["AsyncBridge", "AsyncWorker", "build_backend_options"]
|
|
@@ -4,8 +4,10 @@ from typing import Any
|
|
|
4
4
|
|
|
5
5
|
import msgspec
|
|
6
6
|
|
|
7
|
+
from loom.core.model import LoomFrozenStruct
|
|
7
8
|
|
|
8
|
-
|
|
9
|
+
|
|
10
|
+
class CacheConfig(LoomFrozenStruct, frozen=True, kw_only=True):
|
|
9
11
|
"""Configuration for cache behaviour including TTLs and aiocache backend settings.
|
|
10
12
|
|
|
11
13
|
Attributes:
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""Compiler contracts shared by Loom domains.
|
|
2
|
+
|
|
3
|
+
Compilers translate a request object into an executable plan. The concrete
|
|
4
|
+
request and plan types vary by domain; this protocol only captures the
|
|
5
|
+
shape of the transformation.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Protocol, TypeVar
|
|
11
|
+
|
|
12
|
+
_RequestT = TypeVar("_RequestT", contravariant=True)
|
|
13
|
+
_PlanT = TypeVar("_PlanT", covariant=True)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CompilerProtocol(Protocol[_RequestT, _PlanT]):
|
|
17
|
+
"""Structural protocol for a compiler that materializes an execution plan."""
|
|
18
|
+
|
|
19
|
+
def compile(self, request: _RequestT) -> _PlanT:
|
|
20
|
+
"""Transform *request* into an executable plan."""
|
|
21
|
+
...
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
__all__ = ["CompilerProtocol"]
|