loom-kernel 2.16.0__tar.gz → 2.17.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-2.16.0 → loom_kernel-2.17.0}/CHANGELOG.md +40 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/PKG-INFO +1 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_write_policy.py +8 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/__init__.py +3 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_dtype.py +2 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_writer.py +13 -2
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_filter.py +40 -4
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_into.py +3 -1
- loom_kernel-2.17.0/src/loom/etl/maintenance/__init__.py +124 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_ops.py +12 -5
- loom_kernel-2.17.0/src/loom/etl/runner/filtering.py +41 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/__init__.py +8 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/_contract.py +56 -28
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/__init__.py +4 -1
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/__init__.py +4 -2
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_discovery.py +111 -10
- loom_kernel-2.16.0/src/loom/etl/maintenance/__init__.py +0 -71
- loom_kernel-2.16.0/src/loom/etl/runner/filtering.py +0 -38
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/.gitignore +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/LICENSE +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/README.md +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/pyproject.toml +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/app.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/sqlalchemy.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/locator.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/_loom_type.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/introspection.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/types.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/symbols.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transaction.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/py.typed +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/runner.py +0 -0
|
@@ -230,6 +230,19 @@
|
|
|
230
230
|
params_type, *, name)` from `loom.prefect.flow`, so CI can check that every
|
|
231
231
|
inherited parameter is a field declared `str`, `date` or `datetime` without
|
|
232
232
|
building the flow.
|
|
233
|
+
- **prefect:** `deploy_flow(flow, *, env, work_pool=None)`, exported from
|
|
234
|
+
`loom.prefect` and `loom.prefect.deploy`, registers the deployment of one
|
|
235
|
+
flow built by `etl_flow`, `backfill_flow` or `maintenance_flow`, with the
|
|
236
|
+
same name, tags, parameters, schedule, trigger and work-pool settings
|
|
237
|
+
`discover_and_deploy_etls(flows_package=...)` gives it, and returns its id.
|
|
238
|
+
Flows built on demand, such as by a module `__getattr__`, or a single ETL
|
|
239
|
+
deployed by name no longer need the private `_deploy_single` and metadata
|
|
240
|
+
attribute. `env` is required; `work_pool` is used when the YAML names no
|
|
241
|
+
pool for `env`, and with neither it raises `ValueError`. Before registering
|
|
242
|
+
it checks that the flow's `source_file` exposes the flow under its
|
|
243
|
+
attribute name (the flow name with `-` replaced by `_`), as the worker
|
|
244
|
+
imports it, and raises `ValueError` otherwise; a module not yet imported is
|
|
245
|
+
imported from that file. Any other object raises `TypeError`.
|
|
233
246
|
|
|
234
247
|
### etl
|
|
235
248
|
|
|
@@ -310,9 +323,25 @@
|
|
|
310
323
|
rows and the step fails. Polars checks the row count of the frame the
|
|
311
324
|
replace already collects, at no extra cost; Spark runs `isEmpty()`, one
|
|
312
325
|
job that stops at the first row, before the write recomputes the frame. On
|
|
313
|
-
Polars a `Null`-typed column still fails first, with `SchemaError`.
|
|
326
|
+
Polars a `Null`-typed column still fails first, with `SchemaError`. On
|
|
327
|
+
Spark a streaming DataFrame, whose rows cannot be counted before the
|
|
328
|
+
write, raises `ValueError` and the table is left as it was.
|
|
314
329
|
The default, `allow_empty=True`, keeps today's behaviour, and `ReplaceSpec`
|
|
315
330
|
gains the `allow_empty` field.
|
|
331
|
+
- **etl:** `MaintenanceSpec`, `VacuumSpec`, `CompactSpec` and `ZOrderSpec` are
|
|
332
|
+
exported from `loom.etl.maintenance`, next to `OpSpec` and
|
|
333
|
+
`OperationDeclaration`, so a custom maintenance op (an `OpSpec` appended to
|
|
334
|
+
each `MaintenanceSpec` by a wrapping `OperationDeclaration`) and a custom
|
|
335
|
+
`DeltaTableMaintainer` are written without the private `_ops` module. The
|
|
336
|
+
ETL guide and the package docstring show how to write one.
|
|
337
|
+
- **etl:** `loom.etl.schema.annotation_to_loom_type(ann)` converts one Python
|
|
338
|
+
type annotation to the `LoomType` it declares, as `resolve_schema` does for
|
|
339
|
+
each field of a contract (`X | None` maps as `X`; an unsupported annotation
|
|
340
|
+
raises `TypeError`), and `loom.etl.backends.polars` exports
|
|
341
|
+
`loom_type_to_polars` and `polars_to_loom_type`, so the Polars dtype of a
|
|
342
|
+
contract field is `loom_type_to_polars(annotation_to_loom_type(ann))`. The
|
|
343
|
+
private names `loom.etl.schema._contract._annotation_to_loom_type` and
|
|
344
|
+
`loom.etl.backends.polars._dtype.*` keep working.
|
|
316
345
|
|
|
317
346
|
## ⚠ Behaviour changes
|
|
318
347
|
|
|
@@ -402,6 +431,9 @@
|
|
|
402
431
|
placeholders it started with and repeats the call with the same values,
|
|
403
432
|
which is harmless. The update is one attempt with a 10-second timeout; if
|
|
404
433
|
it fails, the flow logs it at `ERROR` in the run's logs and goes on.
|
|
434
|
+
- **prefect:** the private `_deploy_single(flow, meta, work_pool, env)` of
|
|
435
|
+
`loom.prefect.deploy._discovery` now takes `(flow, meta, plan)`; callers
|
|
436
|
+
migrate to the public `deploy_flow(flow, env=..., work_pool=...)`.
|
|
405
437
|
|
|
406
438
|
### etl
|
|
407
439
|
|
|
@@ -410,6 +442,13 @@
|
|
|
410
442
|
`_map_process_nodes`) are deprecated and removed in loom 3.0; each emits a
|
|
411
443
|
`DeprecationWarning` naming its replacement, `loom.etl.compiler.filter_plan`
|
|
412
444
|
or, for `_collect_all_names`, `iter_processes` and `iter_all_steps`.
|
|
445
|
+
- **etl:** `InvalidStageError` names what it reports: its message reads
|
|
446
|
+
`Unknown step or process names: [...]` instead of `No steps or processes
|
|
447
|
+
match include=[...]`, the constructor's parameter is `unknown`, and the
|
|
448
|
+
names are kept on the new `unknown` attribute. Positional construction is
|
|
449
|
+
unchanged; `InvalidStageError(include=...)` still works, emits a
|
|
450
|
+
`DeprecationWarning` and is removed in loom 3.0. The error survives pickle
|
|
451
|
+
with its `unknown` names, so it crosses process boundaries intact.
|
|
413
452
|
|
|
414
453
|
## 🐛 Fixes
|
|
415
454
|
|
|
@@ -521,7 +521,12 @@ class _WritePolicy(TargetWriter, Generic[InputFrameT, WriteFrameT, PhysicalSchem
|
|
|
521
521
|
|
|
522
522
|
@abstractmethod
|
|
523
523
|
def _is_empty(self, frame: WriteFrameT) -> bool:
|
|
524
|
-
"""Whether the materialised *frame* has no rows.
|
|
524
|
+
"""Whether the materialised *frame* has no rows.
|
|
525
|
+
|
|
526
|
+
Raises:
|
|
527
|
+
ValueError: When the backend cannot count the rows of *frame*
|
|
528
|
+
before the write, such as a Spark streaming DataFrame.
|
|
529
|
+
"""
|
|
525
530
|
|
|
526
531
|
def _materialize_checked(
|
|
527
532
|
self,
|
|
@@ -536,6 +541,8 @@ class _WritePolicy(TargetWriter, Generic[InputFrameT, WriteFrameT, PhysicalSchem
|
|
|
536
541
|
Raises:
|
|
537
542
|
EmptyReplaceError: When *allow_empty* is ``False`` and the
|
|
538
543
|
materialised frame has no rows.
|
|
544
|
+
ValueError: When *allow_empty* is ``False`` and the backend
|
|
545
|
+
cannot count the rows of the materialised frame.
|
|
539
546
|
"""
|
|
540
547
|
materialized = self._materialize_for_write(frame, streaming)
|
|
541
548
|
if not allow_empty:
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Polars backend for the Loom ETL framework."""
|
|
2
2
|
|
|
3
|
+
from loom.etl.backends.polars._dtype import loom_type_to_polars, polars_to_loom_type
|
|
3
4
|
from loom.etl.backends.polars._file_writer import PolarsFileWriter
|
|
4
5
|
from loom.etl.backends.polars._reader import PolarsSourceReader, decode_json_columns
|
|
5
6
|
from loom.etl.backends.polars._schema import PolarsPhysicalSchema, read_delta_physical_schema
|
|
@@ -11,5 +12,7 @@ __all__ = [
|
|
|
11
12
|
"PolarsSourceReader",
|
|
12
13
|
"PolarsTargetWriter",
|
|
13
14
|
"decode_json_columns",
|
|
15
|
+
"loom_type_to_polars",
|
|
16
|
+
"polars_to_loom_type",
|
|
14
17
|
"read_delta_physical_schema",
|
|
15
18
|
]
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"""LoomType ↔ Polars DataType conversion utilities.
|
|
2
2
|
|
|
3
|
-
Internal module —
|
|
3
|
+
Internal module — import ``loom_type_to_polars`` and ``polars_to_loom_type``
|
|
4
|
+
from :mod:`loom.etl.backends.polars`.
|
|
4
5
|
|
|
5
6
|
Two conversion layers
|
|
6
7
|
---------------------
|
|
@@ -144,8 +144,19 @@ class SparkTargetWriter(_WritePolicy[DataFrame, DataFrame, SparkPhysicalSchema])
|
|
|
144
144
|
return frame
|
|
145
145
|
|
|
146
146
|
def _is_empty(self, frame: DataFrame) -> bool:
|
|
147
|
-
"""Whether *frame* has no rows; runs one Spark job that stops at the first row.
|
|
148
|
-
|
|
147
|
+
"""Whether *frame* has no rows; runs one Spark job that stops at the first row.
|
|
148
|
+
|
|
149
|
+
Raises:
|
|
150
|
+
ValueError: When *frame* is a streaming DataFrame, whose rows
|
|
151
|
+
cannot be counted before the write.
|
|
152
|
+
"""
|
|
153
|
+
if frame.isStreaming:
|
|
154
|
+
raise ValueError(
|
|
155
|
+
"replace(allow_empty=False) needs a batch DataFrame to check for rows, "
|
|
156
|
+
"but the frame to write is a streaming DataFrame. Read the source as a "
|
|
157
|
+
"batch DataFrame or declare replace() without allow_empty=False."
|
|
158
|
+
)
|
|
159
|
+
return bool(frame.isEmpty())
|
|
149
160
|
|
|
150
161
|
def _predicate_to_sql(self, predicate: Any, params: Any) -> str:
|
|
151
162
|
"""Convert predicate to SQL."""
|
|
@@ -6,7 +6,9 @@ from :mod:`loom.etl.compiler`.
|
|
|
6
6
|
|
|
7
7
|
from __future__ import annotations
|
|
8
8
|
|
|
9
|
+
import warnings
|
|
9
10
|
from collections.abc import Callable, Iterable
|
|
11
|
+
from typing import Any
|
|
10
12
|
|
|
11
13
|
from loom.etl.compiler._plan import (
|
|
12
14
|
ParallelProcessGroup,
|
|
@@ -22,18 +24,52 @@ from loom.etl.compiler._plan import (
|
|
|
22
24
|
|
|
23
25
|
|
|
24
26
|
class InvalidStageError(ValueError):
|
|
25
|
-
"""Raised when
|
|
27
|
+
"""Raised when a selection names a step or process absent from the compiled plan.
|
|
26
28
|
|
|
27
29
|
Args:
|
|
28
|
-
|
|
30
|
+
unknown: The selected names that match no step or process.
|
|
31
|
+
include: Deprecated keyword spelling of *unknown*, removed in loom 3.0.
|
|
32
|
+
|
|
33
|
+
Attributes:
|
|
34
|
+
unknown: The selected names that match no step or process.
|
|
35
|
+
|
|
36
|
+
Raises:
|
|
37
|
+
TypeError: When both or neither of *unknown* and *include* are given.
|
|
29
38
|
"""
|
|
30
39
|
|
|
31
|
-
def __init__(
|
|
40
|
+
def __init__(
|
|
41
|
+
self,
|
|
42
|
+
unknown: frozenset[str] | None = None,
|
|
43
|
+
*,
|
|
44
|
+
include: frozenset[str] | None = None,
|
|
45
|
+
) -> None:
|
|
46
|
+
self.unknown = _unknown_names(unknown, include)
|
|
32
47
|
super().__init__(
|
|
33
|
-
f"
|
|
48
|
+
f"Unknown step or process names: {sorted(self.unknown)!r}. "
|
|
34
49
|
"Check that the names match the class names of your ETLStep or ETLProcess subclasses."
|
|
35
50
|
)
|
|
36
51
|
|
|
52
|
+
def __reduce__(self) -> tuple[type[InvalidStageError], tuple[frozenset[str]], dict[str, Any]]:
|
|
53
|
+
return type(self), (self.unknown,), self.__dict__
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _unknown_names(
|
|
57
|
+
unknown: frozenset[str] | None, include: frozenset[str] | None
|
|
58
|
+
) -> frozenset[str]:
|
|
59
|
+
if include is None:
|
|
60
|
+
if unknown is None:
|
|
61
|
+
raise TypeError("InvalidStageError() requires the unknown names.")
|
|
62
|
+
return frozenset(unknown)
|
|
63
|
+
if unknown is not None:
|
|
64
|
+
raise TypeError("InvalidStageError() takes unknown= or the deprecated include=, not both.")
|
|
65
|
+
warnings.warn(
|
|
66
|
+
"InvalidStageError(include=...) is deprecated and will be removed in loom 3.0; "
|
|
67
|
+
"use InvalidStageError(unknown=...) instead.",
|
|
68
|
+
DeprecationWarning,
|
|
69
|
+
stacklevel=3,
|
|
70
|
+
)
|
|
71
|
+
return frozenset(include)
|
|
72
|
+
|
|
37
73
|
|
|
38
74
|
def filter_plan(plan: PipelinePlan, include: Iterable[str]) -> PipelinePlan:
|
|
39
75
|
"""Return a new plan keeping only the steps and processes named in *include*.
|
|
@@ -126,7 +126,9 @@ class IntoTable:
|
|
|
126
126
|
is neither replaced nor created. Use it for a
|
|
127
127
|
table, such as a dimension, that an empty read must
|
|
128
128
|
never wipe. Defaults to ``True``: an empty frame
|
|
129
|
-
replaces the table with an empty one.
|
|
129
|
+
replaces the table with an empty one. The Spark
|
|
130
|
+
backend refuses a streaming DataFrame with
|
|
131
|
+
:exc:`ValueError`, since it cannot count its rows.
|
|
130
132
|
|
|
131
133
|
Returns:
|
|
132
134
|
New ``IntoTable`` with REPLACE mode.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"""Delta table maintenance — backend-agnostic vacuum, compact, and Z-Order.
|
|
2
|
+
|
|
3
|
+
Public API
|
|
4
|
+
----------
|
|
5
|
+
|
|
6
|
+
Authoring::
|
|
7
|
+
|
|
8
|
+
from loom.etl.maintenance import MaintenanceStep, MaintainTable, MaintainSchema
|
|
9
|
+
|
|
10
|
+
Running::
|
|
11
|
+
|
|
12
|
+
from loom.etl.maintenance import MaintenanceRunner, MaintenanceReport
|
|
13
|
+
|
|
14
|
+
Result types::
|
|
15
|
+
|
|
16
|
+
from loom.etl.maintenance import (
|
|
17
|
+
VacuumResult,
|
|
18
|
+
OptimizeResult,
|
|
19
|
+
TableMaintenanceResult,
|
|
20
|
+
MaintenanceError,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
Backend protocol (for custom implementations)::
|
|
24
|
+
|
|
25
|
+
from loom.etl.maintenance import DeltaTableMaintainer
|
|
26
|
+
|
|
27
|
+
Operation specs (for custom operations and backends)::
|
|
28
|
+
|
|
29
|
+
from loom.etl.maintenance import (
|
|
30
|
+
MaintenanceSpec,
|
|
31
|
+
OpSpec,
|
|
32
|
+
OperationDeclaration,
|
|
33
|
+
VacuumSpec,
|
|
34
|
+
CompactSpec,
|
|
35
|
+
ZOrderSpec,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
Example::
|
|
39
|
+
|
|
40
|
+
class NightlyMaintenance(MaintenanceStep[None]):
|
|
41
|
+
operations = [
|
|
42
|
+
MaintainSchema("raw").vacuum(retention_hours=168, dry_run=False).compact(),
|
|
43
|
+
MaintainTable("staging.orders")
|
|
44
|
+
.vacuum(dry_run=False)
|
|
45
|
+
.z_order_by(["run_date", "_id"]),
|
|
46
|
+
]
|
|
47
|
+
|
|
48
|
+
runner = MaintenanceRunner.from_config(config)
|
|
49
|
+
report = runner.run(NightlyMaintenance)
|
|
50
|
+
report.raise_if_errors()
|
|
51
|
+
|
|
52
|
+
Custom operations
|
|
53
|
+
-----------------
|
|
54
|
+
|
|
55
|
+
An operation is any class implementing :class:`OpSpec`: a ``name`` class
|
|
56
|
+
variable, which keys its result in :attr:`TableMaintenanceResult.op_results`,
|
|
57
|
+
and an ``execute(maintainer, uri, location)`` method returning a
|
|
58
|
+
:class:`VacuumResult` or an :class:`OptimizeResult` (or a subclass). To run
|
|
59
|
+
it, wrap a declaration in an :class:`OperationDeclaration` whose ``resolve``
|
|
60
|
+
appends the op to each :class:`MaintenanceSpec`::
|
|
61
|
+
|
|
62
|
+
from dataclasses import dataclass, replace
|
|
63
|
+
from typing import ClassVar
|
|
64
|
+
|
|
65
|
+
from deltalake import DeltaTable
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class CheckpointSpec:
|
|
69
|
+
name: ClassVar[str] = "checkpoint"
|
|
70
|
+
|
|
71
|
+
def execute(self, maintainer, uri, location) -> OptimizeResult:
|
|
72
|
+
DeltaTable(uri, storage_options=location.storage_options).create_checkpoint()
|
|
73
|
+
return OptimizeResult()
|
|
74
|
+
|
|
75
|
+
class Checkpointed:
|
|
76
|
+
def __init__(self, inner: OperationDeclaration) -> None:
|
|
77
|
+
self._inner = inner
|
|
78
|
+
|
|
79
|
+
def resolve(self, config: StorageConfig) -> list[MaintenanceSpec]:
|
|
80
|
+
return [
|
|
81
|
+
replace(spec, ops=(*spec.ops, CheckpointSpec()))
|
|
82
|
+
for spec in self._inner.resolve(config)
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
class NightlyMaintenance(MaintenanceStep[None]):
|
|
86
|
+
operations = [Checkpointed(MaintainSchema("raw").vacuum(dry_run=False))]
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
from loom.etl.maintenance._builder import MaintainSchema, MaintainTable
|
|
90
|
+
from loom.etl.maintenance._ops import CompactSpec, MaintenanceSpec, VacuumSpec, ZOrderSpec
|
|
91
|
+
from loom.etl.maintenance._protocol import (
|
|
92
|
+
DeltaTableMaintainer,
|
|
93
|
+
OperationDeclaration,
|
|
94
|
+
OpSpec,
|
|
95
|
+
OptimizeResult,
|
|
96
|
+
TableMaintenanceResult,
|
|
97
|
+
VacuumResult,
|
|
98
|
+
)
|
|
99
|
+
from loom.etl.maintenance._runner import MaintenanceError, MaintenanceReport, MaintenanceRunner
|
|
100
|
+
from loom.etl.maintenance._step import MaintenanceStep
|
|
101
|
+
|
|
102
|
+
__all__ = [
|
|
103
|
+
# authoring
|
|
104
|
+
"MaintenanceStep",
|
|
105
|
+
"MaintainTable",
|
|
106
|
+
"MaintainSchema",
|
|
107
|
+
# runner
|
|
108
|
+
"MaintenanceRunner",
|
|
109
|
+
"MaintenanceReport",
|
|
110
|
+
"MaintenanceError",
|
|
111
|
+
# result types
|
|
112
|
+
"VacuumResult",
|
|
113
|
+
"OptimizeResult",
|
|
114
|
+
"TableMaintenanceResult",
|
|
115
|
+
# protocols
|
|
116
|
+
"DeltaTableMaintainer",
|
|
117
|
+
"OperationDeclaration",
|
|
118
|
+
"OpSpec",
|
|
119
|
+
# operation specs
|
|
120
|
+
"MaintenanceSpec",
|
|
121
|
+
"VacuumSpec",
|
|
122
|
+
"CompactSpec",
|
|
123
|
+
"ZOrderSpec",
|
|
124
|
+
]
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""Operation specs for Delta table maintenance.
|
|
2
2
|
|
|
3
3
|
These dataclasses are the compiled form of MaintainTable / MaintainSchema
|
|
4
|
-
declarations
|
|
5
|
-
|
|
4
|
+
declarations: they carry the final parameter values the backend executes.
|
|
5
|
+
|
|
6
|
+
Internal module — import them from :mod:`loom.etl.maintenance`.
|
|
6
7
|
"""
|
|
7
8
|
|
|
8
9
|
from __future__ import annotations
|
|
@@ -91,8 +92,14 @@ class ZOrderSpec:
|
|
|
91
92
|
|
|
92
93
|
@dataclass(frozen=True)
|
|
93
94
|
class MaintenanceSpec:
|
|
94
|
-
"""
|
|
95
|
-
|
|
95
|
+
"""The ops to run, in order, against one table.
|
|
96
|
+
|
|
97
|
+
:meth:`~loom.etl.maintenance.OperationDeclaration.resolve` returns one per
|
|
98
|
+
table; the runner resolves ``table_ref`` to a location and runs each op.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
table_ref: Logical table reference (e.g. ``"raw.events"``).
|
|
102
|
+
ops: Operations to execute against the table, in order.
|
|
96
103
|
"""
|
|
97
104
|
|
|
98
105
|
table_ref: str
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"""Deprecated plan-filter names, removed in loom 3.0.
|
|
2
|
+
|
|
3
|
+
Use :func:`loom.etl.compiler.filter_plan`. Accessing any name here emits a
|
|
4
|
+
:class:`DeprecationWarning` naming its replacement.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import warnings
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
from loom.etl.compiler import _filter
|
|
13
|
+
|
|
14
|
+
#: Deprecated name → (attribute of ``loom.etl.compiler._filter`` it returns, replacement).
|
|
15
|
+
_DEPRECATED: dict[str, tuple[str, str]] = {
|
|
16
|
+
"_filter_plan": ("filter_plan", "loom.etl.compiler.filter_plan"),
|
|
17
|
+
"_filter_process": ("_filter_process", "loom.etl.compiler.filter_plan"),
|
|
18
|
+
"_collect_all_names": (
|
|
19
|
+
"_collect_all_names",
|
|
20
|
+
"loom.etl.compiler.iter_processes and loom.etl.compiler.iter_all_steps",
|
|
21
|
+
),
|
|
22
|
+
"_map_pipeline_nodes": ("_map_pipeline_nodes", "loom.etl.compiler.filter_plan"),
|
|
23
|
+
"_map_process_nodes": ("_map_process_nodes", "loom.etl.compiler.filter_plan"),
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def __getattr__(name: str) -> Any:
|
|
28
|
+
entry = _DEPRECATED.get(name)
|
|
29
|
+
if entry is None:
|
|
30
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
31
|
+
source, replacement = entry
|
|
32
|
+
warnings.warn(
|
|
33
|
+
f"{__name__}.{name} is deprecated and will be removed in loom 3.0; "
|
|
34
|
+
f"use {replacement} instead.",
|
|
35
|
+
DeprecationWarning,
|
|
36
|
+
stacklevel=2,
|
|
37
|
+
)
|
|
38
|
+
return getattr(_filter, source)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
__all__: list[str] = []
|
|
@@ -4,7 +4,13 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
from loom.etl.declarative.expr._refs import TableRef, col
|
|
6
6
|
|
|
7
|
-
from ._contract import
|
|
7
|
+
from ._contract import (
|
|
8
|
+
JsonContract,
|
|
9
|
+
SchemaContract,
|
|
10
|
+
annotation_to_loom_type,
|
|
11
|
+
resolve_json_type,
|
|
12
|
+
resolve_schema,
|
|
13
|
+
)
|
|
8
14
|
from ._schema import (
|
|
9
15
|
ArrayType,
|
|
10
16
|
CategoricalType,
|
|
@@ -27,6 +33,7 @@ __all__ = [
|
|
|
27
33
|
"JsonContract",
|
|
28
34
|
"resolve_schema",
|
|
29
35
|
"resolve_json_type",
|
|
36
|
+
"annotation_to_loom_type",
|
|
30
37
|
"ColumnSchema",
|
|
31
38
|
"LoomDtype",
|
|
32
39
|
"LoomType",
|
|
@@ -4,8 +4,8 @@ A *contract* is any annotated class (``msgspec.Struct``, ``dataclass``, or
|
|
|
4
4
|
plain Python class with field annotations) or an existing
|
|
5
5
|
:data:`~loom.etl._schema.LoomType` / ``tuple[ColumnSchema, ...]``.
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
Public entry points
|
|
8
|
+
-------------------
|
|
9
9
|
|
|
10
10
|
``resolve_schema``
|
|
11
11
|
Converts a schema contract to ``tuple[ColumnSchema, ...]``. Used by
|
|
@@ -18,6 +18,9 @@ Two public entry points
|
|
|
18
18
|
Used by :meth:`~loom.etl._source.FromTable.parse_json` and
|
|
19
19
|
:meth:`~loom.etl._source.FromFile.parse_json`.
|
|
20
20
|
|
|
21
|
+
``annotation_to_loom_type``
|
|
22
|
+
Converts one Python type annotation to a :data:`~loom.etl._schema.LoomType`.
|
|
23
|
+
|
|
21
24
|
Supported annotation forms
|
|
22
25
|
--------------------------
|
|
23
26
|
|
|
@@ -142,7 +145,7 @@ def resolve_json_type(contract: Any) -> LoomType:
|
|
|
142
145
|
return contract
|
|
143
146
|
if typing.get_origin(contract) is list:
|
|
144
147
|
args = typing.get_args(contract)
|
|
145
|
-
inner =
|
|
148
|
+
inner = annotation_to_loom_type(args[0]) if args else LoomDtype.UTF8
|
|
146
149
|
return ListType(inner=inner)
|
|
147
150
|
if isinstance(contract, type):
|
|
148
151
|
return _class_to_struct_type(contract)
|
|
@@ -151,6 +154,54 @@ def resolve_json_type(contract: Any) -> LoomType:
|
|
|
151
154
|
)
|
|
152
155
|
|
|
153
156
|
|
|
157
|
+
def annotation_to_loom_type(ann: Any) -> LoomType:
|
|
158
|
+
"""Convert a Python type annotation to the :data:`~loom.etl.schema.LoomType` it declares.
|
|
159
|
+
|
|
160
|
+
This is the mapping :func:`resolve_schema` applies to each field of an
|
|
161
|
+
annotated class. ``X | None`` and ``Optional[X]`` map as ``X``.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
ann: ``int``, ``float``, ``str``, ``bool``, ``bytes``,
|
|
165
|
+
``datetime.datetime``, ``datetime.date``, ``list[X]``, an
|
|
166
|
+
annotated class (mapped to a :class:`~loom.etl.schema.StructType`)
|
|
167
|
+
or a :data:`~loom.etl.schema.LoomType` (returned as-is).
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
The matching :data:`~loom.etl.schema.LoomType`.
|
|
171
|
+
|
|
172
|
+
Raises:
|
|
173
|
+
TypeError: If *ann* has no Loom equivalent.
|
|
174
|
+
|
|
175
|
+
Example::
|
|
176
|
+
|
|
177
|
+
>>> annotation_to_loom_type(list[int] | None)
|
|
178
|
+
ListType(inner=<LoomDtype.INT64: 'Int64'>)
|
|
179
|
+
"""
|
|
180
|
+
if isinstance(ann, _LOOM_INSTANCES):
|
|
181
|
+
return ann
|
|
182
|
+
if ann in _PY_TO_LOOM:
|
|
183
|
+
return _PY_TO_LOOM[ann]
|
|
184
|
+
is_opt, inner = _strip_optional(ann)
|
|
185
|
+
if is_opt:
|
|
186
|
+
return annotation_to_loom_type(inner)
|
|
187
|
+
origin = typing.get_origin(ann)
|
|
188
|
+
if origin is list:
|
|
189
|
+
args = typing.get_args(ann)
|
|
190
|
+
inner_type = annotation_to_loom_type(args[0]) if args else LoomDtype.UTF8
|
|
191
|
+
return ListType(inner=inner_type)
|
|
192
|
+
if isinstance(ann, type) and hasattr(ann, "__annotations__"):
|
|
193
|
+
return _class_to_struct_type(ann)
|
|
194
|
+
raise TypeError(
|
|
195
|
+
f"Cannot convert annotation {ann!r} to LoomType. "
|
|
196
|
+
"Supported: int, float, str, bool, bytes, datetime, date, list[X], "
|
|
197
|
+
"LoomType instances, and annotated classes."
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
#: Alias of :func:`annotation_to_loom_type`.
|
|
202
|
+
_annotation_to_loom_type = annotation_to_loom_type
|
|
203
|
+
|
|
204
|
+
|
|
154
205
|
# ---------------------------------------------------------------------------
|
|
155
206
|
# Internal helpers
|
|
156
207
|
# ---------------------------------------------------------------------------
|
|
@@ -159,14 +210,14 @@ def resolve_json_type(contract: Any) -> LoomType:
|
|
|
159
210
|
def _class_to_schema(cls: type[Any]) -> tuple[ColumnSchema, ...]:
|
|
160
211
|
hints = _get_type_hints(cls)
|
|
161
212
|
return tuple(
|
|
162
|
-
ColumnSchema(name=name, dtype=
|
|
213
|
+
ColumnSchema(name=name, dtype=annotation_to_loom_type(ann)) for name, ann in hints.items()
|
|
163
214
|
)
|
|
164
215
|
|
|
165
216
|
|
|
166
217
|
def _class_to_struct_type(cls: type[Any]) -> StructType:
|
|
167
218
|
hints = _get_type_hints(cls)
|
|
168
219
|
fields = tuple(
|
|
169
|
-
StructField(name=name, dtype=
|
|
220
|
+
StructField(name=name, dtype=annotation_to_loom_type(ann)) for name, ann in hints.items()
|
|
170
221
|
)
|
|
171
222
|
return StructType(fields=fields)
|
|
172
223
|
|
|
@@ -184,29 +235,6 @@ def _get_type_hints(cls: type[Any]) -> dict[str, Any]:
|
|
|
184
235
|
return hints
|
|
185
236
|
|
|
186
237
|
|
|
187
|
-
def _annotation_to_loom_type(ann: Any) -> LoomType:
|
|
188
|
-
"""Recursively convert a Python type annotation to a :data:`LoomType`."""
|
|
189
|
-
if isinstance(ann, _LOOM_INSTANCES):
|
|
190
|
-
return ann
|
|
191
|
-
if ann in _PY_TO_LOOM:
|
|
192
|
-
return _PY_TO_LOOM[ann]
|
|
193
|
-
is_opt, inner = _strip_optional(ann)
|
|
194
|
-
if is_opt:
|
|
195
|
-
return _annotation_to_loom_type(inner)
|
|
196
|
-
origin = typing.get_origin(ann)
|
|
197
|
-
if origin is list:
|
|
198
|
-
args = typing.get_args(ann)
|
|
199
|
-
inner_type = _annotation_to_loom_type(args[0]) if args else LoomDtype.UTF8
|
|
200
|
-
return ListType(inner=inner_type)
|
|
201
|
-
if isinstance(ann, type) and hasattr(ann, "__annotations__"):
|
|
202
|
-
return _class_to_struct_type(ann)
|
|
203
|
-
raise TypeError(
|
|
204
|
-
f"Cannot convert annotation {ann!r} to LoomType. "
|
|
205
|
-
"Supported: int, float, str, bool, bytes, datetime, date, list[X], "
|
|
206
|
-
"LoomType instances, and annotated classes."
|
|
207
|
-
)
|
|
208
|
-
|
|
209
|
-
|
|
210
238
|
def _strip_optional(ann: Any) -> tuple[bool, Any]:
|
|
211
239
|
"""Return ``(True, inner)`` if *ann* is ``Optional[X]`` or ``X | None``."""
|
|
212
240
|
is_new_union = isinstance(ann, _builtin_types.UnionType)
|
|
@@ -18,6 +18,8 @@ Public API
|
|
|
18
18
|
factory (hour/day/month/year partitions plus a finalize pass).
|
|
19
19
|
- :func:`discover_and_deploy_etls` — walks a flows package and registers
|
|
20
20
|
one Prefect deployment per ETL.
|
|
21
|
+
- :func:`deploy_flow` — registers the Prefect deployment of one flow built
|
|
22
|
+
by a loom flow factory.
|
|
21
23
|
- :class:`ManifestStore` / :class:`RunManifest` / :class:`StepEntry` —
|
|
22
24
|
ephemeral retry manifest types.
|
|
23
25
|
- :class:`S3JsonManifestStore` — S3-backed manifest implementation.
|
|
@@ -40,7 +42,7 @@ from loom.prefect._config import _load_flow_config as load_flow_config
|
|
|
40
42
|
from loom.prefect._ctx import FlowCtx
|
|
41
43
|
from loom.prefect._meta import FlowTrigger
|
|
42
44
|
from loom.prefect._placeholders import resolve_placeholder
|
|
43
|
-
from loom.prefect.deploy import discover_and_deploy_etls
|
|
45
|
+
from loom.prefect.deploy import deploy_flow, discover_and_deploy_etls
|
|
44
46
|
from loom.prefect.flow import BackfillChunk, backfill_flow, etl_flow, maintenance_flow
|
|
45
47
|
from loom.prefect.manifest import (
|
|
46
48
|
ManifestStore,
|
|
@@ -62,6 +64,7 @@ __all__ = [
|
|
|
62
64
|
"S3JsonManifestStore",
|
|
63
65
|
"StepEntry",
|
|
64
66
|
"backfill_flow",
|
|
67
|
+
"deploy_flow",
|
|
65
68
|
"discover_and_deploy_etls",
|
|
66
69
|
"etl_flow",
|
|
67
70
|
"maintenance_flow",
|
|
@@ -4,6 +4,8 @@ Public surface
|
|
|
4
4
|
--------------
|
|
5
5
|
- :func:`discover_and_deploy_etls` — register one Prefect deployment per
|
|
6
6
|
ETL, found either in a flows package or in YAML declarations.
|
|
7
|
+
- :func:`deploy_flow` — register the deployment of one flow built by a loom
|
|
8
|
+
flow factory.
|
|
7
9
|
- ``entrypoint`` — the module Prefect imports to rebuild a YAML-declared
|
|
8
10
|
flow; it reads the declaration file from ``LOOM_ETL_CONFIG``.
|
|
9
11
|
|
|
@@ -19,6 +21,6 @@ Per-ETL YAML loading and work-pool extraction live in
|
|
|
19
21
|
imports from the flow package, never the reverse.
|
|
20
22
|
"""
|
|
21
23
|
|
|
22
|
-
from loom.prefect.deploy._discovery import discover_and_deploy_etls
|
|
24
|
+
from loom.prefect.deploy._discovery import deploy_flow, discover_and_deploy_etls
|
|
23
25
|
|
|
24
|
-
__all__ = ["discover_and_deploy_etls"]
|
|
26
|
+
__all__ = ["deploy_flow", "discover_and_deploy_etls"]
|