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.
Files changed (685) hide show
  1. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/CHANGELOG.md +40 -1
  2. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/PKG-INFO +1 -1
  3. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_write_policy.py +8 -1
  4. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/__init__.py +3 -0
  5. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_dtype.py +2 -1
  6. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_writer.py +13 -2
  7. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_filter.py +40 -4
  8. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_into.py +3 -1
  9. loom_kernel-2.17.0/src/loom/etl/maintenance/__init__.py +124 -0
  10. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_ops.py +12 -5
  11. loom_kernel-2.17.0/src/loom/etl/runner/filtering.py +41 -0
  12. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/__init__.py +8 -1
  13. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/_contract.py +56 -28
  14. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/__init__.py +4 -1
  15. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/__init__.py +4 -2
  16. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_discovery.py +111 -10
  17. loom_kernel-2.16.0/src/loom/etl/maintenance/__init__.py +0 -71
  18. loom_kernel-2.16.0/src/loom/etl/runner/filtering.py +0 -38
  19. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/.gitignore +0 -0
  20. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/LICENSE +0 -0
  21. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/README.md +0 -0
  22. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/pyproject.toml +0 -0
  23. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/__init__.py +0 -0
  24. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/__init__.py +0 -0
  25. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_concurrency.py +0 -0
  26. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_filters.py +0 -0
  27. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_paths.py +0 -0
  28. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_roles.py +0 -0
  29. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_startup.py +0 -0
  30. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_transport.py +0 -0
  31. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/_usecase.py +0 -0
  32. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/__init__.py +0 -0
  33. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_binding.py +0 -0
  34. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_handlers.py +0 -0
  35. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/_rpc.py +0 -0
  36. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/card.py +0 -0
  37. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/events.py +0 -0
  38. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/a2a/server.py +0 -0
  39. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/abc.py +0 -0
  40. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/bootstrap.py +0 -0
  41. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/__init__.py +0 -0
  42. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_compiler.py +0 -0
  43. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_fingerprint.py +0 -0
  44. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/_plan.py +0 -0
  45. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/__init__.py +0 -0
  46. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_capabilities.py +0 -0
  47. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_conversation.py +0 -0
  48. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_feedable.py +0 -0
  49. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_hook.py +0 -0
  50. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_instructions.py +0 -0
  51. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_limits.py +0 -0
  52. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_model_role.py +0 -0
  53. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_output.py +0 -0
  54. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/compiler/phases/_state.py +0 -0
  55. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/config.py +0 -0
  56. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/__init__.py +0 -0
  57. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_envelope.py +0 -0
  58. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_schema.py +0 -0
  59. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/_v1.py +0 -0
  60. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/declarative/schemas/agent-spec-v1.schema.json +0 -0
  61. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/describe.py +0 -0
  62. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/__init__.py +0 -0
  63. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/__init__.py +0 -0
  64. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_a2a.py +0 -0
  65. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_capabilities.py +0 -0
  66. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_engine.py +0 -0
  67. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_errors.py +0 -0
  68. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_escape.py +0 -0
  69. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_events.py +0 -0
  70. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_guards.py +0 -0
  71. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_history.py +0 -0
  72. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_instructions.py +0 -0
  73. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_limits.py +0 -0
  74. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_mcp.py +0 -0
  75. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_models.py +0 -0
  76. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_native.py +0 -0
  77. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_output.py +0 -0
  78. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_returns.py +0 -0
  79. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_schemas.py +0 -0
  80. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/_spec.py +0 -0
  81. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/__init__.py +0 -0
  82. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/a2a.py +0 -0
  83. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/handlebars.py +0 -0
  84. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/mcp.py +0 -0
  85. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/extras/skills.py +0 -0
  86. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/provider.py +0 -0
  87. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/__init__.py +0 -0
  88. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/_shared.py +0 -0
  89. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/anthropic.py +0 -0
  90. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/bedrock.py +0 -0
  91. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/gateway.py +0 -0
  92. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/openai.py +0 -0
  93. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/engines/pydantic_ai/providers/typesafe.py +0 -0
  94. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/errors.py +0 -0
  95. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/__init__.py +0 -0
  96. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_batch.py +0 -0
  97. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_columns.py +0 -0
  98. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_frames.py +0 -0
  99. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_ledger.py +0 -0
  100. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_runner.py +0 -0
  101. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/etl/_validation.py +0 -0
  102. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/__init__.py +0 -0
  103. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/endpoints.py +0 -0
  104. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/response.py +0 -0
  105. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/fastapi/streaming.py +0 -0
  106. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/inference.py +0 -0
  107. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/pricing.py +0 -0
  108. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/registry.py +0 -0
  109. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/remote_auth.py +0 -0
  110. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/__init__.py +0 -0
  111. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_bounded.py +0 -0
  112. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_chain.py +0 -0
  113. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_conversation.py +0 -0
  114. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_grants.py +0 -0
  115. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_handle.py +0 -0
  116. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_health.py +0 -0
  117. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_hooks.py +0 -0
  118. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_lifecycle.py +0 -0
  119. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_limits.py +0 -0
  120. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/runtime/_mcp.py +0 -0
  121. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/validate/__init__.py +0 -0
  122. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/ai/validate/__main__.py +0 -0
  123. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/__init__.py +0 -0
  124. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/auto.py +0 -0
  125. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/bootstrap.py +0 -0
  126. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/config.py +0 -0
  127. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/constants.py +0 -0
  128. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/runner.py +0 -0
  129. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/celery/service.py +0 -0
  130. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/__init__.py +0 -0
  131. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/app.py +0 -0
  132. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/cli/schema.py +0 -0
  133. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/async_bridge.py +0 -0
  134. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/__init__.py +0 -0
  135. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_decide.py +0 -0
  136. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_grants.py +0 -0
  137. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_roles.py +0 -0
  138. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/_scope.py +0 -0
  139. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/elevation.py +0 -0
  140. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/authz/product.py +0 -0
  141. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/__init__.py +0 -0
  142. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/core_model.py +0 -0
  143. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/protocol.py +0 -0
  144. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/scoped_ddl.py +0 -0
  145. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  146. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/__init__.py +0 -0
  147. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  148. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/bootstrap/kernel.py +0 -0
  149. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/__init__.py +0 -0
  150. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/_batching.py +0 -0
  151. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/_single_flight.py +0 -0
  152. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/__init__.py +0 -0
  153. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/backend.py +0 -0
  154. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/config.py +0 -0
  155. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/abc/dependency.py +0 -0
  156. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/calls.py +0 -0
  157. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/codec.py +0 -0
  158. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/decorators.py +0 -0
  159. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/dependency.py +0 -0
  160. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/errors.py +0 -0
  161. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/gateway.py +0 -0
  162. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/keys.py +0 -0
  163. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/memory.py +0 -0
  164. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/repository.py +0 -0
  165. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/result_codec.py +0 -0
  166. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/serializer.py +0 -0
  167. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/cache/wiring.py +0 -0
  168. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/__init__.py +0 -0
  169. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/adapter.py +0 -0
  170. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/base.py +0 -0
  171. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/field.py +0 -0
  172. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/command/introspection.py +0 -0
  173. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/compiler.py +0 -0
  174. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/__init__.py +0 -0
  175. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_boto3.py +0 -0
  176. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_includes.py +0 -0
  177. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/_resolver_utils.py +0 -0
  178. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/binder.py +0 -0
  179. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/configurable.py +0 -0
  180. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/context.py +0 -0
  181. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/errors.py +0 -0
  182. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/keys.py +0 -0
  183. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/loader.py +0 -0
  184. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/model.py +0 -0
  185. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/observability.py +0 -0
  186. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/resolver.py +0 -0
  187. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/secrets.py +0 -0
  188. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/config/ssm.py +0 -0
  189. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/contracts/__init__.py +0 -0
  190. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/contracts/manifest.py +0 -0
  191. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/__init__.py +0 -0
  192. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/container.py +0 -0
  193. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/di/scope.py +0 -0
  194. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/__init__.py +0 -0
  195. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/_utils.py +0 -0
  196. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/base.py +0 -0
  197. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/interfaces.py +0 -0
  198. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/manifest.py +0 -0
  199. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/discovery/modules.py +0 -0
  200. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/__init__.py +0 -0
  201. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/compilable.py +0 -0
  202. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/compiler.py +0 -0
  203. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/events.py +0 -0
  204. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/executor.py +0 -0
  205. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/metrics.py +0 -0
  206. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/plan.py +0 -0
  207. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/engine/post_commit.py +0 -0
  208. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/__init__.py +0 -0
  209. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/codes.py +0 -0
  210. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/errors/errors.py +0 -0
  211. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/__init__.py +0 -0
  212. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/eval.py +0 -0
  213. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/nodes.py +0 -0
  214. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/expr/refs.py +0 -0
  215. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/__init__.py +0 -0
  216. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/context.py +0 -0
  217. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/identity.py +0 -0
  218. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/issuer.py +0 -0
  219. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/identity/wire.py +0 -0
  220. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/__init__.py +0 -0
  221. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/base.py +0 -0
  222. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/introspection/describe.py +0 -0
  223. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/__init__.py +0 -0
  224. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/callback.py +0 -0
  225. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/context.py +0 -0
  226. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/handle.py +0 -0
  227. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/job.py +0 -0
  228. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/job/service.py +0 -0
  229. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/locator.py +0 -0
  230. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/__init__.py +0 -0
  231. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/abc.py +0 -0
  232. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/config.py +0 -0
  233. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/registry.py +0 -0
  234. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/logger/structlogger.py +0 -0
  235. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/__init__.py +0 -0
  236. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/_loom_type.py +0 -0
  237. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/base.py +0 -0
  238. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/convert.py +0 -0
  239. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/enums.py +0 -0
  240. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/field.py +0 -0
  241. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/introspection.py +0 -0
  242. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/partition.py +0 -0
  243. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/privilege.py +0 -0
  244. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/projection.py +0 -0
  245. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/relation.py +0 -0
  246. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/scoped.py +0 -0
  247. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/struct.py +0 -0
  248. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/timestamped.py +0 -0
  249. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/types.py +0 -0
  250. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/model/types_postgres.py +0 -0
  251. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/__init__.py +0 -0
  252. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/config.py +0 -0
  253. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/event.py +0 -0
  254. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/__init__.py +0 -0
  255. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/noop.py +0 -0
  256. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/otel.py +0 -0
  257. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/observer/structlog.py +0 -0
  258. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/otel_ids.py +0 -0
  259. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/protocol.py +0 -0
  260. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/runtime.py +0 -0
  261. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/span.py +0 -0
  262. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/observability/topology.py +0 -0
  263. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/__init__.py +0 -0
  264. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/abc.py +0 -0
  265. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/none.py +0 -0
  266. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/persistence/registry.py +0 -0
  267. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/__init__.py +0 -0
  268. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/entrypoints.py +0 -0
  269. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/plugins/optional.py +0 -0
  270. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/__init__.py +0 -0
  271. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/loaders.py +0 -0
  272. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/projection/runtime.py +0 -0
  273. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/__init__.py +0 -0
  274. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/__init__.py +0 -0
  275. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/cursor.py +0 -0
  276. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/errors.py +0 -0
  277. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/query.py +0 -0
  278. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/query_compiler.py +0 -0
  279. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  280. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/repository.py +0 -0
  281. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/abc/session_scope.py +0 -0
  282. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/__init__.py +0 -0
  283. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/backend.py +0 -0
  284. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/registry.py +0 -0
  285. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/repository.py +0 -0
  286. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/dynamodb/uow.py +0 -0
  287. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/__init__.py +0 -0
  288. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/backend.py +0 -0
  289. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/ids.py +0 -0
  290. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/query_compiler.py +0 -0
  291. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/registry.py +0 -0
  292. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/repository.py +0 -0
  293. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/uow.py +0 -0
  294. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mongo/values.py +0 -0
  295. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/mutation.py +0 -0
  296. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/registration.py +0 -0
  297. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/registry.py +0 -0
  298. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  299. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/backend.py +0 -0
  300. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  301. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  302. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/__init__.py +0 -0
  303. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/env_template.py +0 -0
  304. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/hook.py +0 -0
  305. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/operations.py +0 -0
  306. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/migrations/runners.py +0 -0
  307. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  308. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  309. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  310. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  311. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  312. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  313. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  314. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  315. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  316. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  317. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  318. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  319. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  320. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  321. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/__init__.py +0 -0
  322. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/bootstrap.py +0 -0
  323. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/config.py +0 -0
  324. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/elevate.py +0 -0
  325. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/0001.sql +0 -0
  326. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/0002.sql +0 -0
  327. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard/preflight.sql +0 -0
  328. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/guard_manifest.py +0 -0
  329. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/integrity.py +0 -0
  330. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/partitions.py +0 -0
  331. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/provider.py +0 -0
  332. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/schema.py +0 -0
  333. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/sources.py +0 -0
  334. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/rls/verify.py +0 -0
  335. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  336. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/session_settings.py +0 -0
  337. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  338. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  339. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/response/__init__.py +0 -0
  340. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/response/base.py +0 -0
  341. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/__init__.py +0 -0
  342. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/ref.py +0 -0
  343. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/routing/resolver.py +0 -0
  344. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/runner.py +0 -0
  345. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema/__init__.py +0 -0
  346. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema/schema_mode.py +0 -0
  347. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/schema_names.py +0 -0
  348. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/__init__.py +0 -0
  349. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/__init__.py +0 -0
  350. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/contracts.py +0 -0
  351. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/abc/errors.py +0 -0
  352. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/caller_bound.py +0 -0
  353. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/__init__.py +0 -0
  354. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/_client.py +0 -0
  355. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/executor.py +0 -0
  356. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/clickhouse/registry.py +0 -0
  357. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/config.py +0 -0
  358. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/roles.py +0 -0
  359. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/sql/service.py +0 -0
  360. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/symbols.py +0 -0
  361. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/tracing/__init__.py +0 -0
  362. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/tracing/context.py +0 -0
  363. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transaction.py +0 -0
  364. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transport/__init__.py +0 -0
  365. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/transport/adapter.py +0 -0
  366. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/__init__.py +0 -0
  367. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/abc.py +0 -0
  368. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/uow/context.py +0 -0
  369. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/__init__.py +0 -0
  370. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/_predicates.py +0 -0
  371. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/agent_markers.py +0 -0
  372. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/compute.py +0 -0
  373. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/constants.py +0 -0
  374. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/factory.py +0 -0
  375. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/field_ref.py +0 -0
  376. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/invoker.py +0 -0
  377. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/keys.py +0 -0
  378. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/markers.py +0 -0
  379. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/mcp_markers.py +0 -0
  380. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/registry.py +0 -0
  381. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/rule.py +0 -0
  382. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/core/use_case/use_case.py +0 -0
  383. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/__init__.py +0 -0
  384. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/__init__.py +0 -0
  385. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_format_registry.py +0 -0
  386. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  387. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  388. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  389. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  390. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  391. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  392. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_merge.py +0 -0
  393. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_path_template.py +0 -0
  394. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_predicate.py +0 -0
  395. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  396. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  397. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  398. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  399. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  400. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  401. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  402. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  403. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  404. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_streaming.py +0 -0
  405. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  406. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/polars/provider.py +0 -0
  407. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  408. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  409. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  410. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  411. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  412. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  413. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/backends/spark/provider.py +0 -0
  414. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  415. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  416. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  417. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  418. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_options.py +0 -0
  419. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  420. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  421. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/checkpoint/_store.py +0 -0
  422. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/__init__.py +0 -0
  423. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_binding.py +0 -0
  424. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_compiler.py +0 -0
  425. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_errors.py +0 -0
  426. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_plan.py +0 -0
  427. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators.py +0 -0
  428. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_agents.py +0 -0
  429. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_config.py +0 -0
  430. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  431. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/compiler/_validators_step.py +0 -0
  432. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/__init__.py +0 -0
  433. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_format.py +0 -0
  434. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_read_options.py +0 -0
  435. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_utils.py +0 -0
  436. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_with_agent.py +0 -0
  437. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/_write_options.py +0 -0
  438. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  439. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  440. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  441. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  442. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  443. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  444. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from.py +0 -0
  445. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_clickhouse.py +0 -0
  446. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_config.py +0 -0
  447. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_dynamodb.py +0 -0
  448. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_from_mongo.py +0 -0
  449. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  450. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  451. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_client.py +0 -0
  452. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_errors.py +0 -0
  453. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_file.py +0 -0
  454. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  455. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  456. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  457. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  458. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  459. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  460. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  461. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_table.py +0 -0
  462. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  463. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/__init__.py +0 -0
  464. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_agents.py +0 -0
  465. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  466. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/executor/_executor.py +0 -0
  467. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/__init__.py +0 -0
  468. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/_registry.py +0 -0
  469. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/__init__.py +0 -0
  470. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_clickhouse.py +0 -0
  471. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb.py +0 -0
  472. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb_items.py +0 -0
  473. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_dynamodb_predicate.py +0 -0
  474. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo.py +0 -0
  475. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_batch.py +0 -0
  476. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_bson.py +0 -0
  477. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_mongo_predicate.py +0 -0
  478. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/sources/_serialization.py +0 -0
  479. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/targets/__init__.py +0 -0
  480. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/io/targets/_clickhouse.py +0 -0
  481. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/__init__.py +0 -0
  482. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_config.py +0 -0
  483. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_observer.py +0 -0
  484. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/_records.py +0 -0
  485. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  486. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  487. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  488. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  489. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_builder.py +0 -0
  490. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_protocol.py +0 -0
  491. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_runner.py +0 -0
  492. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/_step.py +0 -0
  493. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/backends/__init__.py +0 -0
  494. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/maintenance/backends/_delta_rs.py +0 -0
  495. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/__init__.py +0 -0
  496. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_generics.py +0 -0
  497. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_params.py +0 -0
  498. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  499. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_process.py +0 -0
  500. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_sql.py +0 -0
  501. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step.py +0 -0
  502. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step_client.py +0 -0
  503. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  504. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/__init__.py +0 -0
  505. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_agents.py +0 -0
  506. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_providers.py +0 -0
  507. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/_wiring.py +0 -0
  508. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/config_loader.py +0 -0
  509. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/core.py +0 -0
  510. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runner/errors.py +0 -0
  511. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/__init__.py +0 -0
  512. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/_config_values.py +0 -0
  513. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/runtime/contracts.py +0 -0
  514. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/schema/_schema.py +0 -0
  515. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/__init__.py +0 -0
  516. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_config.py +0 -0
  517. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_file_locator.py +0 -0
  518. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/_locator.py +0 -0
  519. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/storage/routing.py +0 -0
  520. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/__init__.py +0 -0
  521. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_result.py +0 -0
  522. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_runners.py +0 -0
  523. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_scenario.py +0 -0
  524. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/_stubs.py +0 -0
  525. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/etl/testing/spark.py +0 -0
  526. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_async.py +0 -0
  527. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_config.py +0 -0
  528. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_ctx.py +0 -0
  529. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_flow_yaml.py +0 -0
  530. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_meta.py +0 -0
  531. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_placeholders.py +0 -0
  532. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/_summary.py +0 -0
  533. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_schedule.py +0 -0
  534. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/_yaml_etls.py +0 -0
  535. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/deploy/entrypoint.py +0 -0
  536. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/__init__.py +0 -0
  537. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_assemble.py +0 -0
  538. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_backfill.py +0 -0
  539. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_backfill_body.py +0 -0
  540. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_body.py +0 -0
  541. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_common.py +0 -0
  542. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_factory.py +0 -0
  543. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_hooks.py +0 -0
  544. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_maintenance.py +0 -0
  545. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_params.py +0 -0
  546. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_run_name.py +0 -0
  547. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_runtime.py +0 -0
  548. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_signature.py +0 -0
  549. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/flow/_stages.py +0 -0
  550. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/__init__.py +0 -0
  551. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_model.py +0 -0
  552. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_s3.py +0 -0
  553. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/manifest/_store.py +0 -0
  554. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/__init__.py +0 -0
  555. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_event.py +0 -0
  556. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_factory.py +0 -0
  557. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_port.py +0 -0
  558. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/notify/_slack.py +0 -0
  559. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/__init__.py +0 -0
  560. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_flow.py +0 -0
  561. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_logging_bridge.py +0 -0
  562. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_manifest.py +0 -0
  563. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prefect/observer/_task_run.py +0 -0
  564. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/__init__.py +0 -0
  565. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/_instruments.py +0 -0
  566. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/adapter.py +0 -0
  567. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/kafka.py +0 -0
  568. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/lifecycle.py +0 -0
  569. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/prometheus/middleware.py +0 -0
  570. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/py.typed +0 -0
  571. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/__init__.py +0 -0
  572. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/_body.py +0 -0
  573. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/adapter.py +0 -0
  574. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/__init__.py +0 -0
  575. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/abc.py +0 -0
  576. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/config.py +0 -0
  577. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/jwt.py +0 -0
  578. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/auth/middleware.py +0 -0
  579. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/autocrud.py +0 -0
  580. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/compiler.py +0 -0
  581. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/config.py +0 -0
  582. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/constants.py +0 -0
  583. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/cors.py +0 -0
  584. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/errors.py +0 -0
  585. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/__init__.py +0 -0
  586. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/_errors.py +0 -0
  587. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/_exclusions.py +0 -0
  588. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/app.py +0 -0
  589. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/auto.py +0 -0
  590. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/health.py +0 -0
  591. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/openapi.py +0 -0
  592. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/response.py +0 -0
  593. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  594. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/fastapi/sql.py +0 -0
  595. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/middleware.py +0 -0
  596. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/model.py +0 -0
  597. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/rest/rest_adapter.py +0 -0
  598. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/__init__.py +0 -0
  599. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  600. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  601. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_batch_spans.py +0 -0
  602. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  603. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  604. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  605. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_errors.py +0 -0
  606. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  607. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  608. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  609. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/_sink_registry.py +0 -0
  610. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  611. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  612. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  613. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  614. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  615. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  616. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  617. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  618. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/handlers/storage.py +0 -0
  619. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/bytewax/runner.py +0 -0
  620. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/__init__.py +0 -0
  621. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  622. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_compiler.py +0 -0
  623. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_errors.py +0 -0
  624. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/_plan.py +0 -0
  625. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/phases/build_plan.py +0 -0
  626. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/compiler/phases/validate.py +0 -0
  627. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/__init__.py +0 -0
  628. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_errors.py +0 -0
  629. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_exceptions.py +0 -0
  630. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_message.py +0 -0
  631. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_tracing.py +0 -0
  632. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/core/_typing.py +0 -0
  633. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/graph/__init__.py +0 -0
  634. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/graph/_flow.py +0 -0
  635. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/__init__.py +0 -0
  636. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_codec.py +0 -0
  637. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_config.py +0 -0
  638. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_errors.py +0 -0
  639. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  640. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_message.py +0 -0
  641. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_record.py +0 -0
  642. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/_wire.py +0 -0
  643. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  644. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  645. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  646. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  647. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/client/_retry.py +0 -0
  648. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  649. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  650. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  651. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  652. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/__init__.py +0 -0
  653. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_bytewax_source.py +0 -0
  654. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_config.py +0 -0
  655. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_event.py +0 -0
  656. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/mongo/_normalize.py +0 -0
  657. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/__init__.py +0 -0
  658. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  659. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_branches.py +0 -0
  660. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  661. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  662. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_decompose.py +0 -0
  663. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_expand_routes.py +0 -0
  664. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  665. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_fork.py +0 -0
  666. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  667. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_mongo.py +0 -0
  668. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  669. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_router.py +0 -0
  670. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_shape.py +0 -0
  671. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_sink.py +0 -0
  672. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_step.py +0 -0
  673. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/__init__.py +0 -0
  674. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/common.py +0 -0
  675. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_table/config.py +0 -0
  676. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/_with.py +0 -0
  677. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/nodes/refs.py +0 -0
  678. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/streaming/testing.py +0 -0
  679. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/__init__.py +0 -0
  680. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/agents.py +0 -0
  681. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/golden.py +0 -0
  682. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/http_harness.py +0 -0
  683. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/in_memory.py +0 -0
  684. {loom_kernel-2.16.0 → loom_kernel-2.17.0}/src/loom/testing/repository_harness.py +0 -0
  685. {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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: loom-kernel
3
- Version: 2.16.0
3
+ Version: 2.17.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Classifier: Programming Language :: Python :: 3
@@ -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 — not part of the public API.
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
- return frame.isEmpty()
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 *include* names a step or process absent from the compiled plan.
27
+ """Raised when a selection names a step or process absent from the compiled plan.
26
28
 
27
29
  Args:
28
- include: The names that match no step or process.
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__(self, include: frozenset[str]) -> None:
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"No steps or processes match include={sorted(include)!r}. "
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
- """Internal operation specs for Delta table maintenance.
1
+ """Operation specs for Delta table maintenance.
2
2
 
3
3
  These dataclasses are the compiled form of MaintainTable / MaintainSchema
4
- declarations — they carry the final parameter values that the backend will
5
- execute. They are not part of the public API.
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
- """All ops to execute against one concrete table (already resolved to its
95
- logical ref — the runner resolves it to a URI via the locator).
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 JsonContract, SchemaContract, resolve_json_type, resolve_schema
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
- Two public entry points
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 = _annotation_to_loom_type(args[0]) if args else LoomDtype.UTF8
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=_annotation_to_loom_type(ann)) for name, ann in hints.items()
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=_annotation_to_loom_type(ann)) for name, ann in hints.items()
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"]