loom-kernel 6.0.1__tar.gz → 7.0.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-6.0.1 → loom_kernel-7.0.0}/CHANGELOG.md +56 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/PKG-INFO +1 -1
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/backend/sqlalchemy.py +4 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/__init__.py +4 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/_loom_type.py +3 -1
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/introspection.py +4 -2
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/types.py +2 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/backend.py +27 -1
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/mixins.py +29 -7
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +13 -6
- loom_kernel-7.0.0/src/loom/core/repository/sqlalchemy/values.py +130 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/_errors.py +4 -1
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/phases/validate.py +17 -8
- loom_kernel-6.0.1/src/loom/core/repository/sqlalchemy/values.py +0 -51
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/.gitignore +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/LICENSE +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/README.md +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/pyproject.toml +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_concurrency.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_filters.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_paths.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_roles.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_startup.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_transport.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/_usecase.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/_binding.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/_handlers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/_rpc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/card.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/events.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/a2a/server.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/abc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/bootstrap.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/_compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/_plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_output.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/compiler/phases/_state.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/declarative/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/declarative/_envelope.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/declarative/_schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/declarative/_v1.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/describe.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_batch.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_columns.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_frames.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_ledger.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_runner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/etl/_validation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/fastapi/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/fastapi/endpoints.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/fastapi/response.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/fastapi/streaming.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/inference.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/pricing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/remote_auth.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_bounded.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_chain.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_conversation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_grants.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_handle.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_health.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_hooks.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_limits.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/runtime/_mcp.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/validate/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/ai/validate/__main__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/auto.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/bootstrap.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/constants.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/runner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/celery/service.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/cli/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/cli/app.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/cli/check.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/cli/schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/async_bridge.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/_decide.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/_grants.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/_roles.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/_scope.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/elevation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/authz/product.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/backend/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/backend/core_model.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/backend/protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/backend/scoped_ddl.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/bootstrap/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/bootstrap/kernel.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/_batching.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/_single_flight.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/abc/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/abc/backend.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/abc/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/abc/dependency.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/calls.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/codec.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/decorators.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/dependency.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/gateway.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/keys.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/memory.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/repository.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/result_codec.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/serializer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/cache/wiring.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/checks.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/command/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/command/adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/command/base.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/command/field.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/command/introspection.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/_boto3.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/_includes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/_resolver_utils.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/binder.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/configurable.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/context.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/keys.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/loader.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/model.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/observability.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/overrides.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/resolver.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/secrets.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/config/ssm.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/contracts/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/contracts/manifest.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/di/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/di/container.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/di/scope.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/_utils.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/base.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/interfaces.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/manifest.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/discovery/modules.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/compilable.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/events.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/executor.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/metrics.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/engine/post_commit.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/environment.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/errors/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/errors/codes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/errors/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/expr/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/expr/eval.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/expr/nodes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/expr/refs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/identity/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/identity/context.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/identity/identity.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/identity/issuer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/identity/wire.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/introspection/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/introspection/base.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/introspection/describe.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/callback.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/context.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/handle.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/job.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/job/service.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/locator.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/abc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/checks.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/logger/structlogger.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/_json_schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/base.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/convert.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/enums.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/field.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/partition.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/privilege.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/projection.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/relation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/scoped.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/struct.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/timestamped.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/model/types_postgres.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/event.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/observer/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/observer/noop.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/observer/otel.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/observer/structlog.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/otel_ids.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/runtime.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/span.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/observability/topology.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/persistence/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/persistence/abc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/persistence/none.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/persistence/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/plugins/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/plugins/entrypoints.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/plugins/optional.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/projection/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/projection/loaders.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/projection/runtime.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/cursor.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/query.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/repo_for.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/repository.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/abc/session_scope.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/backend.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/ids.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/repository.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/uow.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mongo/values.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/mutation.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/registration.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/response/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/response/base.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/routing/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/routing/ref.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/routing/resolver.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/runner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/schema/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/schema/schema_mode.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/schema_names.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/abc/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/abc/contracts.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/abc/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/caller_bound.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/roles.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/sql/service.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/symbols.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/tracing/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/tracing/context.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/transaction.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/transport/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/transport/adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/uow/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/uow/abc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/uow/context.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/_predicates.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/agent_markers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/compute.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/constants.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/factory.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/field_ref.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/invoker.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/keys.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/markers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/mcp_markers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/outcome.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/rule.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/core/use_case/use_case.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/_uri.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_format_registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/_common.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/_log.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_merge.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_path_template.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_predicate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/_write_policy.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_frame.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_historify.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_reader.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/_writer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/polars/provider.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_historify.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_reader.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/_writer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/backends/spark/provider.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_options.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_paths.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_scope.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/checkpoint/_store.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_binding.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_filter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_validators.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_validators_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/compiler/_validators_step.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/_format.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/_read_options.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/_utils.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/_with_agent.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/_write_options.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/expr/_params.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_from.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/source/_specs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_client.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_file.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_into.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_table.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/declarative/target/_temp.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/executor/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/executor/_agents.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/executor/_dispatcher.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/executor/_executor.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/_registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_mongo.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/sources/_serialization.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/targets/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/_observer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/_records.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/_builder.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/_ops.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/_protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/_runner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/_step.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_generics.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_params.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_process.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_sql.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_step.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_step_client.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/_agents.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/_providers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/_wiring.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/config_loader.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/core.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runner/filtering.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runtime/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runtime/_config_values.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/runtime/contracts.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/schema/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/schema/_contract.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/schema/_schema.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/storage/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/storage/_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/storage/_file_locator.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/storage/_locator.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/storage/routing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/_result.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/_runners.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/_scenario.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/_stubs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/etl/testing/spark.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_async.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_ctx.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_flow_yaml.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_meta.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_placeholders.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/_summary.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/deploy/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/deploy/_discovery.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/deploy/_schedule.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_assemble.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_backfill.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_body.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_common.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_factory.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_hooks.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_maintenance.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_params.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_run_name.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_runtime.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_signature.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/flow/_stages.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/manifest/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/manifest/_model.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/manifest/_s3.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/manifest/_store.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_event.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_factory.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_format.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_port.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_slack.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/notify/_sns.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/observer/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/observer/_flow.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/observer/_manifest.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prefect/observer/_task_run.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/_instruments.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/kafka.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/lifecycle.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/prometheus/middleware.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/py.typed +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/_body.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/auth/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/auth/abc.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/auth/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/auth/jwt.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/auth/middleware.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/autocrud.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/checks.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/constants.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/cors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/app.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/auto.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/health.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/openapi.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/response.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/fastapi/sql.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/middleware.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/model.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/rest/rest_adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_operators.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/bytewax/runner.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/_bindings.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/_compiler.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/_plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/_exceptions.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/_message.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/_tracing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/core/_typing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/graph/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/graph/_flow.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_codec.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_errors.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_message.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_record.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/_wire.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/mongo/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/mongo/_config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/mongo/_event.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/mongo/_normalize.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_boundary.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_branches.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_decompose.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_fork.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_helpers.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_mongo.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_protocols.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_router.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_shape.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_sink.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_step.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_table/common.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_table/config.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/_with.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/nodes/refs.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/streaming/testing.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/__init__.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/agents.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/golden.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/http_harness.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/in_memory.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/repository_harness.py +0 -0
- {loom_kernel-6.0.1 → loom_kernel-7.0.0}/src/loom/testing/runner.py +0 -0
|
@@ -623,6 +623,46 @@
|
|
|
623
623
|
settings take effect: `primary_key=True` adds the column to the primary key,
|
|
624
624
|
which can turn a model's key composite, and `nullable=True` makes the column
|
|
625
625
|
nullable. Review such fields before upgrading.
|
|
626
|
+
- **core:** a `date` field is inferred as a `Date` column and a `time` field
|
|
627
|
+
as a `Time` column (`loom.core.model.Date`, `loom.core.model.Time`, new),
|
|
628
|
+
where both used to be inferred as an unbounded `String`; an enum mixed with
|
|
629
|
+
`date` or `time` follows to `Date` or `Time`. The SQLAlchemy repository
|
|
630
|
+
binds `date` and `time` values natively, so on Postgres with asyncpg writing
|
|
631
|
+
either field failed (`expected str, got date`, and the same for `time`). The
|
|
632
|
+
SQLAlchemy repository now refuses a `time` that carries a UTC offset when it
|
|
633
|
+
is written to, or compared with, a column that would drop the offset, with a
|
|
634
|
+
`BoundaryValidationError` (a `ValueError`) naming the column and not the
|
|
635
|
+
value: `boundary_validation` for a write (REST answers `422`),
|
|
636
|
+
`query_validation` for a filter, `get_by`, `exists_by` or `list_paginated`
|
|
637
|
+
value (`400`). Without the check, Postgres and SQLite would store
|
|
638
|
+
`08:30+02:00` in a `Time` column as `08:30`, and an aware filter value would
|
|
639
|
+
match the row holding `08:30`. A JSON column and a `Time` column declared
|
|
640
|
+
with `ColumnType("Time", kwargs={"timezone": True})` accept it; the JSON
|
|
641
|
+
column keeps the written offset, and so does the `Time` column on Postgres
|
|
642
|
+
(`timetz`), which takes only a `time` with an offset: one without (naive, or
|
|
643
|
+
with a zone but no fixed offset) is refused the same way, under
|
|
644
|
+
`time must carry a UTC offset`, since asyncpg cannot encode it for `timetz`;
|
|
645
|
+
every refused column of a write is reported, in name order. On any other
|
|
646
|
+
dialect startup refuses a `Time(timezone=True)` column with a `ConfigError`
|
|
647
|
+
naming `table.column`, since the dialect would not keep the offset. A
|
|
648
|
+
`datetime` field (`DateTime(tz=True)`) keeps the instant on Postgres
|
|
649
|
+
(`timestamptz`) and MongoDB, read back in UTC, not the written offset.
|
|
650
|
+
`get_by`, `exists_by` and the `filters` of `list_paginated` now convert
|
|
651
|
+
their value as a write converts it, as `QuerySpec` filters already did, so a
|
|
652
|
+
plain `Enum` member matches the value the write stored instead of failing to
|
|
653
|
+
bind. A `list_paginated` filter, `get_by` or `exists_by` on a name that is
|
|
654
|
+
not a mapped column of the model (a missing field, a relation, an attribute
|
|
655
|
+
such as `metadata`) raises `ValueError` naming it. An existing Postgres
|
|
656
|
+
table holding these columns as `varchar` needs a migration: Alembic
|
|
657
|
+
autogenerate detects the type change, but Postgres refuses it without a
|
|
658
|
+
cast, so the revision passes `postgresql_using="c::date"` (`"c::time"` for a
|
|
659
|
+
`time` field) to `op.alter_column`, which is
|
|
660
|
+
`ALTER TABLE t ALTER COLUMN c TYPE date USING c::date`. `c::time` drops any
|
|
661
|
+
offset the stored text holds (`'08:30+02'::time` is `08:30`): check first
|
|
662
|
+
with `SELECT c FROM t WHERE c ~ '[+-]\d{2}(:?\d{2})?$'`, and if offsets are
|
|
663
|
+
present convert those rows deliberately (for example to UTC with
|
|
664
|
+
`(c::timetz AT TIME ZONE 'UTC')::time`) before changing the type. MongoDB is
|
|
665
|
+
unaffected: it stores `date` and `time` values as ISO 8601 strings.
|
|
626
666
|
|
|
627
667
|
### ai
|
|
628
668
|
|
|
@@ -928,6 +968,14 @@
|
|
|
928
968
|
`Explode` inside a Router branch fail compilation with
|
|
929
969
|
`ROUTER_BRANCH_UNSAFE_NODE`. Such flows compiled and raised `TypeError` when
|
|
930
970
|
the branch ran.
|
|
971
|
+
- **streaming:** a `Router` requires a record stream. A batch reaching a
|
|
972
|
+
`Router`, such as after a `CollectBatch`, fails compilation with
|
|
973
|
+
`SHAPE_MISMATCH` before `Router`. Such flows compiled and raised
|
|
974
|
+
`TypeError` at the Router when a batch arrived.
|
|
975
|
+
- **streaming:** `ROUTER_BRANCH_SHAPE_DIVERGENCE` reads "messages continuing
|
|
976
|
+
after the router have different shapes: ...", since the unmatched input of
|
|
977
|
+
a `Router` without a default takes part in the check. It read "router
|
|
978
|
+
branches produce different shapes: ...".
|
|
931
979
|
- **streaming:** `SinkPartition.write_batch` and `close` return an `int`: how
|
|
932
980
|
many of the oldest events not yet reported durable they made durable, `0`
|
|
933
981
|
when they only buffered. A custom `IntoSink` partition must report it: a
|
|
@@ -1351,6 +1399,14 @@
|
|
|
1351
1399
|
consumed again from the recovery snapshot or, without one, from the last
|
|
1352
1400
|
committed offset; inside `With` or `WithAsync` the message becomes an error
|
|
1353
1401
|
envelope.
|
|
1402
|
+
- **streaming:** a `Router` branch that ends its path in `IntoTopic`,
|
|
1403
|
+
`IntoSink` or `Drain` no longer takes part in the branch shape check, and a
|
|
1404
|
+
`Router` reports the shape of the messages that continue after it: the
|
|
1405
|
+
output of the branches that do not end their path and, without a default
|
|
1406
|
+
branch, the unmatched input. A `Router` with an `IntoTopic` branch and a
|
|
1407
|
+
`Drain` default failed with `ROUTER_BRANCH_SHAPE_DIVERGENCE`, and a step
|
|
1408
|
+
after a `Router` without a default whose branches all end their path failed
|
|
1409
|
+
with `SHAPE_MISMATCH`; both compile now.
|
|
1354
1410
|
|
|
1355
1411
|
### prefect
|
|
1356
1412
|
|
|
@@ -15,6 +15,7 @@ from sqlalchemy import (
|
|
|
15
15
|
CheckConstraint,
|
|
16
16
|
Column,
|
|
17
17
|
Constraint,
|
|
18
|
+
Date,
|
|
18
19
|
DateTime,
|
|
19
20
|
Float,
|
|
20
21
|
ForeignKey,
|
|
@@ -27,6 +28,7 @@ from sqlalchemy import (
|
|
|
27
28
|
String,
|
|
28
29
|
Table,
|
|
29
30
|
Text,
|
|
31
|
+
Time,
|
|
30
32
|
UniqueConstraint,
|
|
31
33
|
func,
|
|
32
34
|
text,
|
|
@@ -80,7 +82,9 @@ _SA_TYPE_MAP: dict[str, type] = {
|
|
|
80
82
|
"Text": Text,
|
|
81
83
|
"JSON": JSON,
|
|
82
84
|
"Bytes": LargeBinary,
|
|
85
|
+
"Date": Date,
|
|
83
86
|
"DateTime": DateTime,
|
|
87
|
+
"Time": Time,
|
|
84
88
|
"Numeric": Numeric,
|
|
85
89
|
"Postgres.JSONB": PG_JSONB,
|
|
86
90
|
"Postgres.UUID": PG_UUID,
|
|
@@ -44,6 +44,7 @@ from loom.core.model.types import (
|
|
|
44
44
|
BigInteger,
|
|
45
45
|
Boolean,
|
|
46
46
|
Bytes,
|
|
47
|
+
Date,
|
|
47
48
|
DateTime,
|
|
48
49
|
Float,
|
|
49
50
|
Integer,
|
|
@@ -51,6 +52,7 @@ from loom.core.model.types import (
|
|
|
51
52
|
Numeric,
|
|
52
53
|
String,
|
|
53
54
|
Text,
|
|
55
|
+
Time,
|
|
54
56
|
)
|
|
55
57
|
from loom.core.model.types_postgres import Postgres
|
|
56
58
|
|
|
@@ -85,6 +87,7 @@ __all__ = [
|
|
|
85
87
|
"ColumnField",
|
|
86
88
|
"ScopedField",
|
|
87
89
|
"ColumnType",
|
|
90
|
+
"Date",
|
|
88
91
|
"DateTime",
|
|
89
92
|
"Field",
|
|
90
93
|
"Float",
|
|
@@ -105,6 +108,7 @@ __all__ = [
|
|
|
105
108
|
"ServerOnUpdate",
|
|
106
109
|
"String",
|
|
107
110
|
"Text",
|
|
111
|
+
"Time",
|
|
108
112
|
"UnsupportedBoundaryType",
|
|
109
113
|
"get_column_fields",
|
|
110
114
|
"get_id_attribute",
|
|
@@ -107,7 +107,9 @@ class BoundaryValidationError(LoomError, ValueError):
|
|
|
107
107
|
reasons drop the detail pydantic derives from the input; the msgspec
|
|
108
108
|
message is forwarded as one line, without the value msgspec echoes for an
|
|
109
109
|
invalid enum value or tag. A message raised by the type's own validator
|
|
110
|
-
keeps its text.
|
|
110
|
+
keeps its text. A repository raises it for a value its storage cannot
|
|
111
|
+
hold, such as the SQLAlchemy repository for a ``time`` whose UTC offset,
|
|
112
|
+
present or missing, its column cannot take. It is also a
|
|
111
113
|
:class:`ValueError`, so an ``except ValueError`` that used to catch
|
|
112
114
|
``msgspec.ValidationError`` or ``pydantic.ValidationError`` keeps
|
|
113
115
|
catching it.
|
|
@@ -31,11 +31,13 @@ from loom.core.model.types import (
|
|
|
31
31
|
JSON,
|
|
32
32
|
Boolean,
|
|
33
33
|
Bytes,
|
|
34
|
+
Date,
|
|
34
35
|
DateTime,
|
|
35
36
|
Float,
|
|
36
37
|
Integer,
|
|
37
38
|
Numeric,
|
|
38
39
|
String,
|
|
40
|
+
Time,
|
|
39
41
|
)
|
|
40
42
|
from loom.core.schema_names import sql_identifier
|
|
41
43
|
|
|
@@ -405,8 +407,8 @@ _SCALAR_TYPE_MAP: dict[type, ColumnType] = {
|
|
|
405
407
|
bool: Boolean,
|
|
406
408
|
bytes: Bytes,
|
|
407
409
|
datetime: DateTime(tz=True),
|
|
408
|
-
date:
|
|
409
|
-
time:
|
|
410
|
+
date: Date,
|
|
411
|
+
time: Time,
|
|
410
412
|
Decimal: Numeric(),
|
|
411
413
|
}
|
|
412
414
|
|
|
@@ -9,7 +9,7 @@ from contextlib import asynccontextmanager
|
|
|
9
9
|
from typing import ClassVar, Final, Literal
|
|
10
10
|
|
|
11
11
|
import msgspec
|
|
12
|
-
from sqlalchemy import inspect, make_url, text
|
|
12
|
+
from sqlalchemy import MetaData, Time, inspect, make_url, text
|
|
13
13
|
from sqlalchemy.ext.asyncio import AsyncConnection
|
|
14
14
|
|
|
15
15
|
from loom.core.authz.elevation import ElevationSink
|
|
@@ -205,6 +205,31 @@ def startup_checks(
|
|
|
205
205
|
return unprotected
|
|
206
206
|
|
|
207
207
|
|
|
208
|
+
def check_time_zone_columns(dialect: str, metadata: MetaData) -> None:
|
|
209
|
+
"""Refuse a ``Time(timezone=True)`` column on a dialect that drops its offset.
|
|
210
|
+
|
|
211
|
+
Postgres stores such a column as ``time with time zone`` and keeps the
|
|
212
|
+
offset; SQLite ignores the zone and stores the time without it.
|
|
213
|
+
|
|
214
|
+
Raises:
|
|
215
|
+
ConfigError: When *metadata* holds such a column and *dialect* is not
|
|
216
|
+
Postgres, naming each ``table.column``.
|
|
217
|
+
"""
|
|
218
|
+
if dialect == POSTGRES_DIALECT:
|
|
219
|
+
return
|
|
220
|
+
columns = sorted(
|
|
221
|
+
f"{table.name}.{column.name}"
|
|
222
|
+
for table in metadata.tables.values()
|
|
223
|
+
for column in table.columns
|
|
224
|
+
if isinstance(column.type, Time) and column.type.timezone
|
|
225
|
+
)
|
|
226
|
+
if columns:
|
|
227
|
+
raise ConfigError(
|
|
228
|
+
f"dialect {dialect!r} would drop the UTC offset of the Time(timezone=True) "
|
|
229
|
+
f"columns {', '.join(columns)}; declare a JSON column to keep the offset"
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
|
|
208
233
|
@asynccontextmanager
|
|
209
234
|
async def _lifespan(
|
|
210
235
|
session_manager: SessionManager,
|
|
@@ -223,6 +248,7 @@ async def _lifespan(
|
|
|
223
248
|
scoped,
|
|
224
249
|
has_session_settings=session_manager.has_session_settings,
|
|
225
250
|
)
|
|
251
|
+
check_time_zone_columns(session_manager.engine.dialect.name, get_metadata())
|
|
226
252
|
if unprotected:
|
|
227
253
|
_logger.warning(
|
|
228
254
|
"scoped tables left unprotected on this dialect: %s", ", ".join(unprotected)
|
|
@@ -11,6 +11,7 @@ from sqlalchemy import update as sa_update
|
|
|
11
11
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
12
12
|
|
|
13
13
|
from loom.core.backend.sqlalchemy import get_compiled_core
|
|
14
|
+
from loom.core.errors.codes import ErrorCode
|
|
14
15
|
from loom.core.model.convert import to_struct
|
|
15
16
|
from loom.core.model.introspection import (
|
|
16
17
|
get_column_fields,
|
|
@@ -33,7 +34,12 @@ from loom.core.repository.mutation import MutationEvent
|
|
|
33
34
|
from loom.core.repository.sqlalchemy.integrity import handle_integrity_errors
|
|
34
35
|
from loom.core.repository.sqlalchemy.query_compiler.compiler import QuerySpecCompiler
|
|
35
36
|
from loom.core.repository.sqlalchemy.transactional import record_mutation
|
|
36
|
-
from loom.core.repository.sqlalchemy.values import
|
|
37
|
+
from loom.core.repository.sqlalchemy.values import (
|
|
38
|
+
check_time_offsets,
|
|
39
|
+
is_json_column,
|
|
40
|
+
to_column_value,
|
|
41
|
+
to_comparison_value,
|
|
42
|
+
)
|
|
37
43
|
|
|
38
44
|
_SENTINEL = object()
|
|
39
45
|
_TOTAL_COUNT_ALIAS = "__loom_total_count"
|
|
@@ -161,7 +167,14 @@ class SQLAlchemyContextMixin(Generic[OutputT, IdT]):
|
|
|
161
167
|
builtins = to_column_value(data)
|
|
162
168
|
if not isinstance(builtins, dict):
|
|
163
169
|
raise TypeError("Struct payload must serialize to dict")
|
|
164
|
-
|
|
170
|
+
values = self._encode_json_columns(_to_internal_field_names(type(data), builtins))
|
|
171
|
+
sa_model = self._effective_sa_model
|
|
172
|
+
names = (self._column_field_names or frozenset()).intersection(values)
|
|
173
|
+
check_time_offsets(
|
|
174
|
+
((getattr(sa_model, name), values[name]) for name in names),
|
|
175
|
+
code=ErrorCode.BOUNDARY_VALIDATION,
|
|
176
|
+
)
|
|
177
|
+
return values
|
|
165
178
|
return data
|
|
166
179
|
|
|
167
180
|
def _encode_json_columns(self, values: dict[str, Any]) -> dict[str, Any]:
|
|
@@ -174,10 +187,11 @@ class SQLAlchemyContextMixin(Generic[OutputT, IdT]):
|
|
|
174
187
|
"""Resolve a model column attribute by field name.
|
|
175
188
|
|
|
176
189
|
Raises:
|
|
177
|
-
ValueError: If ``field``
|
|
190
|
+
ValueError: If ``field`` is not a mapped column of the SQLAlchemy
|
|
191
|
+
model.
|
|
178
192
|
"""
|
|
179
193
|
sa_model = self._effective_sa_model
|
|
180
|
-
if not
|
|
194
|
+
if field not in inspect(sa_model).column_attrs:
|
|
181
195
|
raise ValueError(f"Unknown field '{field}' for model '{self.model.__name__}'")
|
|
182
196
|
return getattr(sa_model, field)
|
|
183
197
|
|
|
@@ -189,7 +203,12 @@ class SQLAlchemyContextMixin(Generic[OutputT, IdT]):
|
|
|
189
203
|
"""Apply page-mode filters to an offset items statement."""
|
|
190
204
|
if not filter_params or not filter_params.filters:
|
|
191
205
|
return items_stmt
|
|
192
|
-
return items_stmt.filter_by(
|
|
206
|
+
return items_stmt.filter_by(
|
|
207
|
+
**{
|
|
208
|
+
name: to_comparison_value(self._column_for_field(name), value)
|
|
209
|
+
for name, value in filter_params.filters.items()
|
|
210
|
+
}
|
|
211
|
+
)
|
|
193
212
|
|
|
194
213
|
def _to_output(
|
|
195
214
|
self,
|
|
@@ -441,7 +460,9 @@ class SQLAlchemyReadMixin(SQLAlchemyContextMixin[OutputT, IdT], Generic[OutputT,
|
|
|
441
460
|
"""Fetch one entity by equality over an arbitrary column field."""
|
|
442
461
|
async with self._session_scope() as scoped_session:
|
|
443
462
|
core_model = self._effective_core_model
|
|
444
|
-
|
|
463
|
+
column = self._column_for_field(field)
|
|
464
|
+
stmt = core_model.select(profile).where(column == to_comparison_value(column, value))
|
|
465
|
+
stmt = stmt.limit(1)
|
|
445
466
|
loaded = await core_model.fetch_one(scoped_session, stmt, profile=profile)
|
|
446
467
|
return cast(OutputT | None, loaded)
|
|
447
468
|
|
|
@@ -575,7 +596,8 @@ class SQLAlchemyReadMixin(SQLAlchemyContextMixin[OutputT, IdT], Generic[OutputT,
|
|
|
575
596
|
|
|
576
597
|
async def exists_by(self, field: str, value: Any) -> bool:
|
|
577
598
|
"""Check whether an entity exists by an arbitrary column field."""
|
|
578
|
-
|
|
599
|
+
column = self._column_for_field(field)
|
|
600
|
+
return await self._exists_where(column == to_comparison_value(column, value))
|
|
579
601
|
|
|
580
602
|
async def _exists_where(self, clause: Any) -> bool:
|
|
581
603
|
async with self._session_scope() as scoped_session:
|
|
@@ -15,7 +15,7 @@ from loom.core.repository.sqlalchemy.query_compiler.subquery import (
|
|
|
15
15
|
compile_exists,
|
|
16
16
|
compile_not_exists,
|
|
17
17
|
)
|
|
18
|
-
from loom.core.repository.sqlalchemy.values import
|
|
18
|
+
from loom.core.repository.sqlalchemy.values import to_comparison_value
|
|
19
19
|
|
|
20
20
|
_RELATION_OPS = frozenset([FilterOp.EXISTS, FilterOp.NOT_EXISTS])
|
|
21
21
|
_SIMPLE_OPS: dict[FilterOp, Callable[[Any, Any], Any]] = {
|
|
@@ -50,6 +50,8 @@ def compile_filter_group(
|
|
|
50
50
|
Raises:
|
|
51
51
|
UnsafeFilterError: If a field is not in ``allowed_fields``.
|
|
52
52
|
FilterPathError: If a field path cannot be resolved.
|
|
53
|
+
BoundaryValidationError: ``query_validation``, for a ``time`` whose
|
|
54
|
+
offset the compared column cannot take.
|
|
53
55
|
"""
|
|
54
56
|
clauses = [_compile_spec(sa_model, spec, allowed_fields) for spec in group.filters]
|
|
55
57
|
if group.op == "OR":
|
|
@@ -78,17 +80,22 @@ def _compile_spec(
|
|
|
78
80
|
def _apply_op(col: Any, op: FilterOp, value: Any) -> Any:
|
|
79
81
|
"""Apply *op*, converting *value* as the repository converts a value it writes.
|
|
80
82
|
|
|
81
|
-
A
|
|
82
|
-
|
|
83
|
+
A ``time`` whose offset the column cannot take is refused, as
|
|
84
|
+
:func:`to_comparison_value` refuses it. A SQLAlchemy expression, and an
|
|
85
|
+
``IN`` value that is a string or not iterable, reach SQLAlchemy as they
|
|
86
|
+
are.
|
|
87
|
+
|
|
88
|
+
Raises:
|
|
89
|
+
ValueError: If *op* is not a supported operator.
|
|
90
|
+
BoundaryValidationError: ``query_validation``, for a refused ``time``.
|
|
83
91
|
"""
|
|
84
92
|
handler = _SIMPLE_OPS.get(op)
|
|
85
93
|
if handler is None:
|
|
86
94
|
raise ValueError(f"Unsupported FilterOp: {op!r}")
|
|
87
95
|
if isinstance(value, ClauseElement):
|
|
88
96
|
return handler(col, value)
|
|
89
|
-
json = is_json_column(col)
|
|
90
97
|
if op is not FilterOp.IN:
|
|
91
|
-
return handler(col,
|
|
98
|
+
return handler(col, to_comparison_value(col, value))
|
|
92
99
|
if isinstance(value, str | bytes) or not isinstance(value, Iterable):
|
|
93
100
|
return handler(col, value)
|
|
94
|
-
return handler(col, [
|
|
101
|
+
return handler(col, [to_comparison_value(col, item) for item in value])
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"""Column form of model values in SQLAlchemy rows.
|
|
2
|
+
|
|
3
|
+
SQLAlchemy binds ``bytes``, ``datetime``, ``date``, ``time``, ``Decimal`` and
|
|
4
|
+
``UUID`` natively; every other value is reduced to msgspec builtins (an
|
|
5
|
+
``Enum`` to its value, a struct to a dict). A JSON column holds builtins only,
|
|
6
|
+
so its values are reduced completely.
|
|
7
|
+
|
|
8
|
+
:func:`to_column_value` is the conversion the repository applies to a value it
|
|
9
|
+
writes, and :func:`to_comparison_value` the one it applies to a value compared
|
|
10
|
+
with a column (a filter, ``get_by``, ``exists_by``), so a comparison matches
|
|
11
|
+
exactly what the row holds.
|
|
12
|
+
|
|
13
|
+
A ``time`` with a UTC offset is refused for a column that cannot hold the
|
|
14
|
+
offset: SQL ``TIME`` without time zone (Postgres ``time``, SQLite text) stores
|
|
15
|
+
``08:30+02:00`` as ``08:30``, and an aware value compared with it matches the
|
|
16
|
+
row holding ``08:30``. A JSON column, which keeps the ISO text, takes any
|
|
17
|
+
``time``. A ``Time`` column with ``timezone=True`` (Postgres ``timetz``) takes
|
|
18
|
+
only a ``time`` with an offset: asyncpg cannot encode a naive one for it. The
|
|
19
|
+
SQLAlchemy backend refuses such a column at startup on any dialect other than
|
|
20
|
+
Postgres.
|
|
21
|
+
"""
|
|
22
|
+
|
|
23
|
+
from __future__ import annotations
|
|
24
|
+
|
|
25
|
+
from collections.abc import Iterable
|
|
26
|
+
from datetime import date, datetime, time
|
|
27
|
+
from decimal import Decimal
|
|
28
|
+
from typing import Any
|
|
29
|
+
from uuid import UUID
|
|
30
|
+
|
|
31
|
+
import msgspec
|
|
32
|
+
from sqlalchemy import JSON, Time
|
|
33
|
+
|
|
34
|
+
from loom.core.errors.codes import ErrorCode
|
|
35
|
+
from loom.core.model import BoundaryValidationError
|
|
36
|
+
|
|
37
|
+
# Values SQLAlchemy binds natively; encoding them to strings breaks typed columns.
|
|
38
|
+
_NATIVE_COLUMN_TYPES = (bytes, datetime, date, time, Decimal, UUID)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def to_column_value(value: object, *, json: bool = False) -> Any:
|
|
42
|
+
"""Return the form ``value`` takes in a column.
|
|
43
|
+
|
|
44
|
+
Args:
|
|
45
|
+
value: A model value or a filter value.
|
|
46
|
+
json: ``True`` when the column is a JSON column.
|
|
47
|
+
|
|
48
|
+
Returns:
|
|
49
|
+
``value`` reduced to msgspec builtins, keeping the natively bound
|
|
50
|
+
types unless the column is a JSON column.
|
|
51
|
+
"""
|
|
52
|
+
if json:
|
|
53
|
+
return msgspec.to_builtins(value)
|
|
54
|
+
return msgspec.to_builtins(value, builtin_types=_NATIVE_COLUMN_TYPES)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
_OFFSET_REFUSED = "time must not carry a UTC offset"
|
|
58
|
+
_OFFSET_REQUIRED = "time must carry a UTC offset"
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def check_time_offsets(bindings: Iterable[tuple[Any, object]], *, code: str) -> None:
|
|
62
|
+
"""Raise when a time's offset, present or missing, does not fit the column it is bound to.
|
|
63
|
+
|
|
64
|
+
A JSON column takes any ``time``. A ``Time(timezone=True)`` column keeps the
|
|
65
|
+
offset and takes only a ``time`` that has one (``utcoffset()`` is not
|
|
66
|
+
``None``); every other column drops the offset and takes only a ``time``
|
|
67
|
+
without one. A model that needs the offset declares a JSON column or
|
|
68
|
+
``ColumnType("Time", kwargs={"timezone": True})`` (Postgres only); on
|
|
69
|
+
Postgres a ``datetime`` field keeps the instant instead. The error names
|
|
70
|
+
the columns, not the values.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
bindings: ``(column, value)`` pairs, each a SQLAlchemy column or mapped
|
|
74
|
+
attribute and a value about to be written to or compared with it.
|
|
75
|
+
code: ``boundary_validation`` for written values, ``query_validation``
|
|
76
|
+
for compared values.
|
|
77
|
+
|
|
78
|
+
Raises:
|
|
79
|
+
BoundaryValidationError: With one violation per refused column, in
|
|
80
|
+
column name order.
|
|
81
|
+
"""
|
|
82
|
+
violations = sorted(
|
|
83
|
+
(column.key, reason)
|
|
84
|
+
for column, value in bindings
|
|
85
|
+
if (reason := _time_offset_refusal(column, value)) is not None
|
|
86
|
+
)
|
|
87
|
+
if violations:
|
|
88
|
+
message = "; ".join(f"{name}: {reason}" for name, reason in violations)
|
|
89
|
+
raise BoundaryValidationError(message, tuple(violations), code=code)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _time_offset_refusal(column: Any, value: object) -> str | None:
|
|
93
|
+
if not isinstance(value, time) or is_json_column(column):
|
|
94
|
+
return None
|
|
95
|
+
column_type = getattr(column, "type", None)
|
|
96
|
+
keeps_offset = isinstance(column_type, Time) and bool(column_type.timezone)
|
|
97
|
+
if (value.utcoffset() is not None) == keeps_offset:
|
|
98
|
+
return None
|
|
99
|
+
return _OFFSET_REQUIRED if keeps_offset else _OFFSET_REFUSED
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def to_comparison_value(column: Any, value: object) -> Any:
|
|
103
|
+
"""Return *value* in the form it is compared with *column*.
|
|
104
|
+
|
|
105
|
+
Refused as :func:`check_time_offsets` refuses it, and converted as
|
|
106
|
+
:func:`to_column_value` converts a written value. A refusal is raised under
|
|
107
|
+
``query_validation`` whatever the value's source, so ``get_by`` and
|
|
108
|
+
``exists_by`` called with a value from a command body raise it too.
|
|
109
|
+
|
|
110
|
+
Args:
|
|
111
|
+
column: A SQLAlchemy column or mapped attribute.
|
|
112
|
+
value: A filter or lookup value.
|
|
113
|
+
|
|
114
|
+
Raises:
|
|
115
|
+
BoundaryValidationError: ``query_validation``, for a ``time`` whose
|
|
116
|
+
offset *column* cannot take, as :func:`check_time_offsets` decides.
|
|
117
|
+
"""
|
|
118
|
+
check_time_offsets(((column, value),), code=ErrorCode.QUERY_VALIDATION)
|
|
119
|
+
return to_column_value(value, json=is_json_column(column))
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def is_json_column(column: object) -> bool:
|
|
123
|
+
"""Whether *column*, a SQLAlchemy column or mapped attribute, holds JSON.
|
|
124
|
+
|
|
125
|
+
``JSON`` and the dialect types derived from it (Postgres ``JSONB``) count.
|
|
126
|
+
"""
|
|
127
|
+
return isinstance(getattr(column, "type", None), JSON)
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
__all__ = ["check_time_offsets", "is_json_column", "to_column_value", "to_comparison_value"]
|
|
@@ -116,7 +116,10 @@ class StreamingErrorCode(IssueCode):
|
|
|
116
116
|
)
|
|
117
117
|
ROUTER_BRANCH_SHAPE_DIVERGENCE = (
|
|
118
118
|
"ROUTER_BRANCH_SHAPE_DIVERGENCE",
|
|
119
|
-
Template(
|
|
119
|
+
Template(
|
|
120
|
+
"messages continuing after the router have different shapes: {shapes}",
|
|
121
|
+
component="router",
|
|
122
|
+
),
|
|
120
123
|
)
|
|
121
124
|
OUTPUT_WITH_FORK = (
|
|
122
125
|
"OUTPUT_WITH_FORK",
|
|
@@ -22,6 +22,7 @@ from loom.streaming.mongo import MongoConfig
|
|
|
22
22
|
from loom.streaming.nodes._boundary import FromMultiTypeTopic, FromTopic, IntoTopic
|
|
23
23
|
from loom.streaming.nodes._branches import (
|
|
24
24
|
PATH_END_NODE_TYPES,
|
|
25
|
+
branch_ends_path,
|
|
25
26
|
is_branching_node,
|
|
26
27
|
iter_branches,
|
|
27
28
|
router_ends_every_path,
|
|
@@ -350,7 +351,7 @@ def _validate_shape_node(
|
|
|
350
351
|
if isinstance(node, ExpandRoutes):
|
|
351
352
|
return _validate_expand_routes_node(node, idx, node_list)
|
|
352
353
|
if isinstance(node, Router):
|
|
353
|
-
router_errors, next_shape = _validate_router_shapes(node,
|
|
354
|
+
router_errors, next_shape = _validate_router_shapes(node, StreamShape.RECORD)
|
|
354
355
|
if router_ends_every_path(node):
|
|
355
356
|
not_last = StreamingErrorCode.TERMINAL_NOT_LAST.issue(component=type(node).__name__)
|
|
356
357
|
router_errors.extend(_must_be_last_errors(idx, node_list, not_last))
|
|
@@ -519,10 +520,16 @@ def _validate_router_shapes(
|
|
|
519
520
|
router: Router[StreamPayload, StreamPayload],
|
|
520
521
|
initial_shape: StreamShape,
|
|
521
522
|
) -> tuple[list[CompilationIssue], StreamShape]:
|
|
523
|
+
"""Validate *router*'s branches and return the shape of the messages that continue.
|
|
524
|
+
|
|
525
|
+
Those are the outputs of the branches that do not end their path and, without
|
|
526
|
+
a default branch, the unmatched input; only they must agree on one shape.
|
|
527
|
+
"""
|
|
522
528
|
errors: list[CompilationIssue] = []
|
|
523
|
-
outputs:
|
|
529
|
+
outputs: dict[StreamShape, None] = {} if router.default is not None else {initial_shape: None}
|
|
524
530
|
|
|
525
|
-
for
|
|
531
|
+
for branch in iter_branches(router):
|
|
532
|
+
label, nodes = branch.label, branch.nodes
|
|
526
533
|
branch_errors, branch_output = _validate_router_branch_shape_sequence(nodes, initial_shape)
|
|
527
534
|
errors.extend(_prefixed(issue, f"router branch {label}") for issue in branch_errors)
|
|
528
535
|
for node in nodes:
|
|
@@ -538,14 +545,14 @@ def _validate_router_shapes(
|
|
|
538
545
|
label=label, node=type(node).__name__
|
|
539
546
|
)
|
|
540
547
|
)
|
|
541
|
-
|
|
548
|
+
if not branch_ends_path(branch):
|
|
549
|
+
outputs[branch_output] = None
|
|
542
550
|
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
shapes = {shape.value for shape in unique_outputs}
|
|
551
|
+
if len(outputs) > 1:
|
|
552
|
+
shapes = {shape.value for shape in outputs}
|
|
546
553
|
errors.append(StreamingErrorCode.ROUTER_BRANCH_SHAPE_DIVERGENCE.issue(shapes=shapes))
|
|
547
554
|
|
|
548
|
-
return errors, outputs
|
|
555
|
+
return errors, next(iter(outputs), StreamShape.NONE)
|
|
549
556
|
|
|
550
557
|
|
|
551
558
|
def _labelled_branch_nodes(node: object) -> Iterable[tuple[str, tuple[object, ...]]]:
|
|
@@ -656,6 +663,8 @@ def _node_input_shape(node: object) -> StreamShape | None:
|
|
|
656
663
|
return None
|
|
657
664
|
if isinstance(node, Fork):
|
|
658
665
|
return None
|
|
666
|
+
if isinstance(node, Router):
|
|
667
|
+
return StreamShape.RECORD
|
|
659
668
|
return None
|
|
660
669
|
|
|
661
670
|
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
"""Column form of model values in SQLAlchemy rows.
|
|
2
|
-
|
|
3
|
-
SQLAlchemy binds ``bytes``, ``datetime``, ``date``, ``time``, ``Decimal`` and
|
|
4
|
-
``UUID`` natively; every other value is reduced to msgspec builtins (an
|
|
5
|
-
``Enum`` to its value, a struct to a dict). A JSON column holds builtins only,
|
|
6
|
-
so its values are reduced completely.
|
|
7
|
-
|
|
8
|
-
:func:`to_column_value` is the conversion the repository applies to a value it
|
|
9
|
-
writes and the query compiler to a filter value, so a filter compares against
|
|
10
|
-
exactly what the row holds.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import annotations
|
|
14
|
-
|
|
15
|
-
from datetime import date, datetime, time
|
|
16
|
-
from decimal import Decimal
|
|
17
|
-
from typing import Any
|
|
18
|
-
from uuid import UUID
|
|
19
|
-
|
|
20
|
-
import msgspec
|
|
21
|
-
from sqlalchemy import JSON
|
|
22
|
-
|
|
23
|
-
# Values SQLAlchemy binds natively; encoding them to strings breaks typed columns.
|
|
24
|
-
_NATIVE_COLUMN_TYPES = (bytes, datetime, date, time, Decimal, UUID)
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def to_column_value(value: object, *, json: bool = False) -> Any:
|
|
28
|
-
"""Return the form ``value`` takes in a column.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
value: A model value or a filter value.
|
|
32
|
-
json: ``True`` when the column is a JSON column.
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
``value`` reduced to msgspec builtins, keeping the natively bound
|
|
36
|
-
types unless the column is a JSON column.
|
|
37
|
-
"""
|
|
38
|
-
if json:
|
|
39
|
-
return msgspec.to_builtins(value)
|
|
40
|
-
return msgspec.to_builtins(value, builtin_types=_NATIVE_COLUMN_TYPES)
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def is_json_column(column: object) -> bool:
|
|
44
|
-
"""Whether *column*, a SQLAlchemy column or mapped attribute, holds JSON.
|
|
45
|
-
|
|
46
|
-
``JSON`` and the dialect types derived from it (Postgres ``JSONB``) count.
|
|
47
|
-
"""
|
|
48
|
-
return isinstance(getattr(column, "type", None), JSON)
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
__all__ = ["is_json_column", "to_column_value"]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|