loom-kernel 0.4.0__tar.gz → 0.6.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 (761) hide show
  1. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.github/workflows/ci-main.yml +2 -2
  2. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.github/workflows/ci-pr.yml +2 -2
  3. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.gitignore +1 -0
  4. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/CHANGELOG.md +145 -0
  5. loom_kernel-0.6.0/CHANGELOG_RELEASE.md +116 -0
  6. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/PKG-INFO +17 -3
  7. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/README.md +7 -2
  8. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/conf.py +2 -0
  9. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/etl/pipelines.md +9 -3
  10. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/etl/testing.md +2 -1
  11. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/examples-repo/index.md +9 -6
  12. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/getting-started/etl.md +9 -3
  13. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/getting-started/rest.md +16 -7
  14. loom_kernel-0.6.0/docs/getting-started/streaming.md +97 -0
  15. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/guides/celery.md +9 -0
  16. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/guides/etl.md +9 -3
  17. loom_kernel-0.6.0/docs/guides/quickstart.md +7 -0
  18. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/index.rst +13 -0
  19. loom_kernel-0.6.0/docs/overview.md +122 -0
  20. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/api/etl.rst +1 -1
  21. loom_kernel-0.6.0/docs/reference/api/streaming.rst +29 -0
  22. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/index.rst +1 -0
  23. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/rest/celery.md +9 -0
  24. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/rest/examples.md +9 -6
  25. loom_kernel-0.6.0/docs/streaming/bytewax.md +62 -0
  26. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/pyproject.toml +20 -5
  27. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/bootstrap.py +86 -43
  28. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/config.py +37 -3
  29. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/runner.py +139 -80
  30. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/service.py +27 -12
  31. loom_kernel-0.6.0/src/loom/core/async_bridge.py +149 -0
  32. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/backend/core_model.py +2 -4
  33. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/__init__.py +11 -1
  34. loom_kernel-0.6.0/src/loom/core/config/configurable.py +78 -0
  35. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/keys.py +1 -0
  36. loom_kernel-0.6.0/src/loom/core/config/observability.py +51 -0
  37. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/__init__.py +1 -2
  38. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/executor.py +2 -4
  39. loom_kernel-0.6.0/src/loom/core/expr/__init__.py +39 -0
  40. loom_kernel-0.6.0/src/loom/core/expr/eval.py +127 -0
  41. loom_kernel-0.6.0/src/loom/core/expr/nodes.py +132 -0
  42. loom_kernel-0.6.0/src/loom/core/expr/refs.py +106 -0
  43. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/logger/config.py +28 -0
  44. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/__init__.py +2 -1
  45. loom_kernel-0.6.0/src/loom/core/model/struct.py +38 -0
  46. loom_kernel-0.6.0/src/loom/core/observability/__init__.py +28 -0
  47. loom_kernel-0.6.0/src/loom/core/observability/config.py +102 -0
  48. loom_kernel-0.6.0/src/loom/core/observability/event.py +196 -0
  49. loom_kernel-0.6.0/src/loom/core/observability/observer/__init__.py +1 -0
  50. loom_kernel-0.6.0/src/loom/core/observability/observer/noop.py +27 -0
  51. loom_kernel-0.6.0/src/loom/core/observability/observer/otel.py +216 -0
  52. loom_kernel-0.6.0/src/loom/core/observability/observer/structlog.py +73 -0
  53. loom_kernel-0.6.0/src/loom/core/observability/protocol.py +34 -0
  54. loom_kernel-0.6.0/src/loom/core/observability/runtime.py +230 -0
  55. loom_kernel-0.6.0/src/loom/core/observability/topology.py +32 -0
  56. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/projection/loaders.py +0 -4
  57. loom_kernel-0.6.0/src/loom/core/routing/__init__.py +11 -0
  58. loom_kernel-0.6.0/src/loom/core/routing/ref.py +49 -0
  59. loom_kernel-0.6.0/src/loom/core/routing/resolver.py +63 -0
  60. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/rule.py +1 -2
  61. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/__init__.py +4 -3
  62. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_writer.py +6 -6
  63. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/provider.py +15 -15
  64. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_writer.py +5 -5
  65. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/provider.py +15 -15
  66. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_scope.py +1 -1
  67. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/expr/_refs.py +9 -8
  68. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/source/_from.py +3 -2
  69. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_into.py +3 -2
  70. loom_kernel-0.6.0/src/loom/etl/executor/__init__.py +10 -0
  71. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/executor/_executor.py +58 -44
  72. loom_kernel-0.6.0/src/loom/etl/lineage/__init__.py +5 -0
  73. loom_kernel-0.6.0/src/loom/etl/lineage/_config.py +43 -0
  74. loom_kernel-0.6.0/src/loom/etl/lineage/_observer.py +269 -0
  75. loom_kernel-0.4.0/src/loom/etl/observability/records.py → loom_kernel-0.6.0/src/loom/etl/lineage/_records.py +12 -23
  76. loom_kernel-0.6.0/src/loom/etl/lineage/sinks/__init__.py +17 -0
  77. loom_kernel-0.6.0/src/loom/etl/lineage/sinks/_protocol.py +44 -0
  78. loom_kernel-0.6.0/src/loom/etl/lineage/sinks/_table.py +34 -0
  79. loom_kernel-0.6.0/src/loom/etl/lineage/sinks/_writer.py +22 -0
  80. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/_providers.py +6 -6
  81. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/_wiring.py +32 -11
  82. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/config_loader.py +5 -5
  83. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/core.py +37 -20
  84. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/__init__.py +4 -3
  85. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/_stubs.py +99 -39
  86. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/spark.py +16 -8
  87. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/prometheus/__init__.py +5 -0
  88. loom_kernel-0.6.0/src/loom/prometheus/kafka.py +163 -0
  89. loom_kernel-0.6.0/src/loom/prometheus/lifecycle.py +125 -0
  90. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/app.py +15 -21
  91. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/auto.py +34 -64
  92. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/router_runtime.py +66 -26
  93. loom_kernel-0.6.0/src/loom/streaming/__init__.py +104 -0
  94. loom_kernel-0.6.0/src/loom/streaming/bytewax/__init__.py +27 -0
  95. loom_kernel-0.6.0/src/loom/streaming/bytewax/_adapter.py +402 -0
  96. loom_kernel-0.6.0/src/loom/streaming/bytewax/_commit_tracker.py +125 -0
  97. loom_kernel-0.6.0/src/loom/streaming/bytewax/_dlq.py +173 -0
  98. loom_kernel-0.6.0/src/loom/streaming/bytewax/_error_boundary.py +148 -0
  99. loom_kernel-0.6.0/src/loom/streaming/bytewax/_operators.py +365 -0
  100. loom_kernel-0.6.0/src/loom/streaming/bytewax/_resource_manager.py +68 -0
  101. loom_kernel-0.6.0/src/loom/streaming/bytewax/_runtime_io.py +498 -0
  102. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/__init__.py +1 -0
  103. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/_shared.py +378 -0
  104. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/boundary.py +14 -0
  105. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/dispatcher.py +82 -0
  106. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/routing.py +232 -0
  107. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/scopes.py +288 -0
  108. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/shapes.py +83 -0
  109. loom_kernel-0.6.0/src/loom/streaming/bytewax/handlers/steps.py +248 -0
  110. loom_kernel-0.6.0/src/loom/streaming/bytewax/runner.py +345 -0
  111. loom_kernel-0.6.0/src/loom/streaming/compiler/__init__.py +23 -0
  112. loom_kernel-0.6.0/src/loom/streaming/compiler/_bindings.py +282 -0
  113. loom_kernel-0.6.0/src/loom/streaming/compiler/_compiler.py +53 -0
  114. loom_kernel-0.6.0/src/loom/streaming/compiler/_plan.py +94 -0
  115. loom_kernel-0.6.0/src/loom/streaming/compiler/phases/build_plan.py +276 -0
  116. loom_kernel-0.6.0/src/loom/streaming/compiler/phases/validate.py +432 -0
  117. loom_kernel-0.6.0/src/loom/streaming/core/__init__.py +17 -0
  118. loom_kernel-0.6.0/src/loom/streaming/core/_errors.py +136 -0
  119. loom_kernel-0.6.0/src/loom/streaming/core/_exceptions.py +27 -0
  120. loom_kernel-0.6.0/src/loom/streaming/core/_message.py +65 -0
  121. loom_kernel-0.6.0/src/loom/streaming/core/_typing.py +7 -0
  122. loom_kernel-0.6.0/src/loom/streaming/graph/__init__.py +5 -0
  123. loom_kernel-0.6.0/src/loom/streaming/graph/_flow.py +180 -0
  124. loom_kernel-0.6.0/src/loom/streaming/kafka/__init__.py +96 -0
  125. loom_kernel-0.6.0/src/loom/streaming/kafka/_codec.py +75 -0
  126. loom_kernel-0.6.0/src/loom/streaming/kafka/_config.py +289 -0
  127. loom_kernel-0.6.0/src/loom/streaming/kafka/_errors.py +39 -0
  128. loom_kernel-0.6.0/src/loom/streaming/kafka/_key_resolver.py +64 -0
  129. loom_kernel-0.6.0/src/loom/streaming/kafka/_message.py +162 -0
  130. loom_kernel-0.6.0/src/loom/streaming/kafka/_record.py +33 -0
  131. loom_kernel-0.6.0/src/loom/streaming/kafka/_wire.py +321 -0
  132. loom_kernel-0.6.0/src/loom/streaming/kafka/client/__init__.py +1 -0
  133. loom_kernel-0.6.0/src/loom/streaming/kafka/client/_consumer.py +179 -0
  134. loom_kernel-0.6.0/src/loom/streaming/kafka/client/_producer.py +203 -0
  135. loom_kernel-0.6.0/src/loom/streaming/kafka/client/_protocol.py +73 -0
  136. loom_kernel-0.6.0/src/loom/streaming/kafka/message/__init__.py +1 -0
  137. loom_kernel-0.6.0/src/loom/streaming/kafka/message/_consumer.py +143 -0
  138. loom_kernel-0.6.0/src/loom/streaming/kafka/message/_producer.py +191 -0
  139. loom_kernel-0.6.0/src/loom/streaming/kafka/message/_protocol.py +101 -0
  140. loom_kernel-0.6.0/src/loom/streaming/nodes/__init__.py +82 -0
  141. loom_kernel-0.6.0/src/loom/streaming/nodes/_boundary.py +160 -0
  142. loom_kernel-0.6.0/src/loom/streaming/nodes/_broadcast.py +97 -0
  143. loom_kernel-0.6.0/src/loom/streaming/nodes/_capabilities.py +12 -0
  144. loom_kernel-0.6.0/src/loom/streaming/nodes/_expr_eval.py +31 -0
  145. loom_kernel-0.6.0/src/loom/streaming/nodes/_fork.py +155 -0
  146. loom_kernel-0.6.0/src/loom/streaming/nodes/_helpers.py +26 -0
  147. loom_kernel-0.6.0/src/loom/streaming/nodes/_protocols.py +31 -0
  148. loom_kernel-0.6.0/src/loom/streaming/nodes/_router.py +139 -0
  149. loom_kernel-0.6.0/src/loom/streaming/nodes/_shape.py +117 -0
  150. loom_kernel-0.6.0/src/loom/streaming/nodes/_step.py +158 -0
  151. loom_kernel-0.6.0/src/loom/streaming/nodes/_with.py +289 -0
  152. loom_kernel-0.6.0/src/loom/streaming/nodes/refs.py +13 -0
  153. loom_kernel-0.6.0/src/loom/streaming/testing.py +224 -0
  154. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/runner.py +2 -1
  155. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +46 -21
  156. loom_kernel-0.6.0/tests/integration/core/bootstrap/test_bootstrap_integration.py +240 -0
  157. loom_kernel-0.6.0/tests/integration/core/rest/test_rest_error_mapping.py +248 -0
  158. loom_kernel-0.6.0/tests/integration/core/rest/test_rest_observability.py +238 -0
  159. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/etl/test_runner_integration.py +6 -5
  160. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +5 -2
  161. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/config/conf.yaml +5 -3
  162. loom_kernel-0.6.0/tests/unit/celery_bootstrap/test_async_runtime.py +87 -0
  163. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/celery_bootstrap/test_bootstrap.py +74 -56
  164. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/celery_jobs/test_celery_service.py +26 -5
  165. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/celery_jobs/test_config.py +49 -4
  166. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/celery_jobs/test_runner.py +193 -134
  167. loom_kernel-0.6.0/tests/unit/core/config/test_configurable.py +40 -0
  168. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/errors/test_errors.py +48 -81
  169. loom_kernel-0.6.0/tests/unit/core/expr/test_expr.py +57 -0
  170. loom_kernel-0.6.0/tests/unit/core/logger/test_config.py +24 -0
  171. loom_kernel-0.6.0/tests/unit/core/observability/test_observers.py +363 -0
  172. loom_kernel-0.6.0/tests/unit/core/observability/test_runtime.py +179 -0
  173. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +2 -2
  174. loom_kernel-0.6.0/tests/unit/core/routing/test_routing.py +38 -0
  175. loom_kernel-0.6.0/tests/unit/core/test_async_bridge.py +112 -0
  176. loom_kernel-0.6.0/tests/unit/core/uow/__init__.py +0 -0
  177. loom_kernel-0.6.0/tests/unit/core/use_case/__init__.py +0 -0
  178. loom_kernel-0.6.0/tests/unit/etl/__init__.py +0 -0
  179. loom_kernel-0.6.0/tests/unit/etl/backends/__init__.py +0 -0
  180. loom_kernel-0.6.0/tests/unit/etl/backends/test_polars/__init__.py +0 -0
  181. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +13 -3
  182. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +1 -1
  183. loom_kernel-0.6.0/tests/unit/etl/backends/test_spark/__init__.py +0 -0
  184. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +13 -5
  185. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +1 -1
  186. loom_kernel-0.6.0/tests/unit/etl/checkpoint/__init__.py +0 -0
  187. loom_kernel-0.6.0/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
  188. loom_kernel-0.6.0/tests/unit/etl/compiler/__init__.py +0 -0
  189. loom_kernel-0.6.0/tests/unit/etl/io/__init__.py +0 -0
  190. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_history_target.py +68 -197
  191. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_source.py +3 -1
  192. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_target.py +7 -1
  193. loom_kernel-0.6.0/tests/unit/etl/lineage/test_observer.py +187 -0
  194. loom_kernel-0.6.0/tests/unit/etl/lineage/test_records.py +101 -0
  195. loom_kernel-0.6.0/tests/unit/etl/lineage/test_store.py +74 -0
  196. loom_kernel-0.6.0/tests/unit/etl/schema/__init__.py +0 -0
  197. loom_kernel-0.6.0/tests/unit/etl/sql/__init__.py +0 -0
  198. loom_kernel-0.6.0/tests/unit/etl/storage/__init__.py +0 -0
  199. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_backend_factory.py +36 -119
  200. loom_kernel-0.6.0/tests/unit/etl/storage/test_observability_and_protocols.py +118 -0
  201. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_config_loader.py +17 -10
  202. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_executor.py +43 -18
  203. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_module_contracts.py +8 -8
  204. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_public_api_discovery.py +2 -3
  205. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_record_schema_coverage.py +2 -2
  206. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_runner.py +75 -2
  207. loom_kernel-0.6.0/tests/unit/etl/testing/__init__.py +0 -0
  208. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +91 -10
  209. loom_kernel-0.6.0/tests/unit/prometheus/__init__.py +0 -0
  210. loom_kernel-0.6.0/tests/unit/rest/__init__.py +0 -0
  211. loom_kernel-0.6.0/tests/unit/rest/test_fastapi_auto_logger.py +116 -0
  212. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_router_runtime.py +89 -9
  213. loom_kernel-0.6.0/tests/unit/streaming/__init__.py +1 -0
  214. loom_kernel-0.6.0/tests/unit/streaming/bytewax/__init__.py +0 -0
  215. loom_kernel-0.6.0/tests/unit/streaming/bytewax/cases.py +160 -0
  216. loom_kernel-0.6.0/tests/unit/streaming/bytewax/conftest.py +94 -0
  217. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_adapter.py +293 -0
  218. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_batch_key.py +59 -0
  219. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +1053 -0
  220. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_collect_batch.py +56 -0
  221. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_dlq.py +259 -0
  222. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_error_boundary.py +179 -0
  223. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_operators.py +169 -0
  224. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_runner.py +225 -0
  225. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_runtime_io.py +382 -0
  226. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_runtime_sink.py +140 -0
  227. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_runtime_source.py +97 -0
  228. loom_kernel-0.6.0/tests/unit/streaming/bytewax/test_steps.py +221 -0
  229. loom_kernel-0.6.0/tests/unit/streaming/compiler/__init__.py +0 -0
  230. loom_kernel-0.6.0/tests/unit/streaming/compiler/cases.py +20 -0
  231. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_async_walk.py +91 -0
  232. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_basics.py +108 -0
  233. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_config_bindings.py +370 -0
  234. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_multi_source.py +77 -0
  235. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_router.py +131 -0
  236. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_window.py +52 -0
  237. loom_kernel-0.6.0/tests/unit/streaming/compiler/test_with.py +103 -0
  238. loom_kernel-0.6.0/tests/unit/streaming/conftest.py +153 -0
  239. loom_kernel-0.6.0/tests/unit/streaming/contracts/__init__.py +0 -0
  240. loom_kernel-0.6.0/tests/unit/streaming/contracts/cases.py +47 -0
  241. loom_kernel-0.6.0/tests/unit/streaming/contracts/test_boundary.py +60 -0
  242. loom_kernel-0.6.0/tests/unit/streaming/contracts/test_message.py +66 -0
  243. loom_kernel-0.6.0/tests/unit/streaming/contracts/test_multi_boundary.py +92 -0
  244. loom_kernel-0.6.0/tests/unit/streaming/contracts/test_steps.py +127 -0
  245. loom_kernel-0.6.0/tests/unit/streaming/flows/__init__.py +1 -0
  246. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/__init__.py +81 -0
  247. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/batch.py +140 -0
  248. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/fork.py +212 -0
  249. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/router.py +54 -0
  250. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/shared.py +204 -0
  251. loom_kernel-0.6.0/tests/unit/streaming/flows/cases/simple.py +38 -0
  252. loom_kernel-0.6.0/tests/unit/streaming/flows/conftest.py +47 -0
  253. loom_kernel-0.6.0/tests/unit/streaming/flows/test_compiler_examples.py +94 -0
  254. loom_kernel-0.6.0/tests/unit/streaming/flows/test_flow_examples.py +205 -0
  255. loom_kernel-0.6.0/tests/unit/streaming/kafka/__init__.py +1 -0
  256. loom_kernel-0.6.0/tests/unit/streaming/kafka/cases.py +19 -0
  257. loom_kernel-0.6.0/tests/unit/streaming/kafka/conftest.py +139 -0
  258. loom_kernel-0.6.0/tests/unit/streaming/kafka/fakes.py +289 -0
  259. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_client.py +401 -0
  260. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_config.py +109 -0
  261. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_key_resolver.py +28 -0
  262. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_message.py +116 -0
  263. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_message_client.py +432 -0
  264. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_multi_wire.py +284 -0
  265. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_observability.py +158 -0
  266. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_settings.py +184 -0
  267. loom_kernel-0.6.0/tests/unit/streaming/kafka/test_wire.py +108 -0
  268. loom_kernel-0.6.0/tests/unit/streaming/nodes/__init__.py +0 -0
  269. loom_kernel-0.6.0/tests/unit/streaming/nodes/conftest.py +123 -0
  270. loom_kernel-0.6.0/tests/unit/streaming/nodes/test_broadcast.py +115 -0
  271. loom_kernel-0.6.0/tests/unit/streaming/nodes/test_logging.py +86 -0
  272. loom_kernel-0.6.0/tests/unit/streaming/observability/__init__.py +0 -0
  273. loom_kernel-0.6.0/tests/unit/streaming/observability/cases.py +53 -0
  274. loom_kernel-0.6.0/tests/unit/streaming/observability/conftest.py +30 -0
  275. loom_kernel-0.6.0/tests/unit/streaming/observability/test_observability_runner.py +93 -0
  276. loom_kernel-0.6.0/tests/unit/streaming/observability/test_protocols.py +81 -0
  277. loom_kernel-0.6.0/tests/unit/streaming/observability/test_registry.py +21 -0
  278. loom_kernel-0.6.0/tests/unit/streaming/observability/test_structlog.py +79 -0
  279. loom_kernel-0.6.0/tests/unit/streaming/support/__init__.py +0 -0
  280. loom_kernel-0.6.0/tests/unit/streaming/support/flow_cases.py +494 -0
  281. loom_kernel-0.6.0/tests/unit/streaming/test_fork.py +131 -0
  282. loom_kernel-0.6.0/tests/unit/streaming/test_otel_observability.py +33 -0
  283. loom_kernel-0.6.0/tests/unit/streaming/test_routing.py +145 -0
  284. loom_kernel-0.6.0/tests/unit/streaming/test_with.py +205 -0
  285. loom_kernel-0.6.0/tests/unit/testing/__init__.py +0 -0
  286. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/uv.lock +78 -5
  287. loom_kernel-0.4.0/CHANGELOG_RELEASE.md +0 -15
  288. loom_kernel-0.4.0/docs/guides/quickstart.md +0 -423
  289. loom_kernel-0.4.0/src/loom/celery/event_loop.py +0 -158
  290. loom_kernel-0.4.0/src/loom/core/model/struct.py +0 -14
  291. loom_kernel-0.4.0/src/loom/etl/executor/__init__.py +0 -61
  292. loom_kernel-0.4.0/src/loom/etl/observability/__init__.py +0 -59
  293. loom_kernel-0.4.0/src/loom/etl/observability/config.py +0 -106
  294. loom_kernel-0.4.0/src/loom/etl/observability/factory.py +0 -52
  295. loom_kernel-0.4.0/src/loom/etl/observability/observers/__init__.py +0 -13
  296. loom_kernel-0.4.0/src/loom/etl/observability/observers/_labels.py +0 -57
  297. loom_kernel-0.4.0/src/loom/etl/observability/observers/composite.py +0 -62
  298. loom_kernel-0.4.0/src/loom/etl/observability/observers/noop.py +0 -36
  299. loom_kernel-0.4.0/src/loom/etl/observability/observers/otel.py +0 -263
  300. loom_kernel-0.4.0/src/loom/etl/observability/observers/protocol.py +0 -37
  301. loom_kernel-0.4.0/src/loom/etl/observability/observers/structlog.py +0 -100
  302. loom_kernel-0.4.0/src/loom/etl/observability/recording/__init__.py +0 -5
  303. loom_kernel-0.4.0/src/loom/etl/observability/recording/_recorder.py +0 -225
  304. loom_kernel-0.4.0/src/loom/etl/observability/sinks/__init__.py +0 -17
  305. loom_kernel-0.4.0/src/loom/etl/observability/sinks/_protocol.py +0 -44
  306. loom_kernel-0.4.0/src/loom/etl/observability/sinks/_table.py +0 -42
  307. loom_kernel-0.4.0/src/loom/etl/observability/sinks/_writer.py +0 -26
  308. loom_kernel-0.4.0/tests/integration/etl/test_runtime_contracts.py +0 -455
  309. loom_kernel-0.4.0/tests/unit/celery_bootstrap/test_event_loop.py +0 -182
  310. loom_kernel-0.4.0/tests/unit/etl/storage/test_observability_and_protocols.py +0 -149
  311. loom_kernel-0.4.0/tests/unit/etl/test_observer.py +0 -351
  312. loom_kernel-0.4.0/tests/unit/etl/test_observer_internals.py +0 -448
  313. loom_kernel-0.4.0/tests/unit/rest/test_fastapi_auto_logger.py +0 -157
  314. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.github/workflows/docs.yml +0 -0
  315. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.github/workflows/release.yml +0 -0
  316. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.pre-commit-config.yaml +0 -0
  317. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/.readthedocs.yaml +0 -0
  318. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/LICENSE +0 -0
  319. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/Makefile +0 -0
  320. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/codecov.yml +0 -0
  321. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/_static/.gitkeep +0 -0
  322. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/_static/custom.css +0 -0
  323. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/_static/logo-transparent.png +0 -0
  324. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/_static/logo.svg +0 -0
  325. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/architecture/adr/README.md +0 -0
  326. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/architecture/clean-architecture.md +0 -0
  327. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/architecture/overview.md +0 -0
  328. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/etl/examples.md +0 -0
  329. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/guides/autocrud.md +0 -0
  330. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/guides/fake-repo-examples.md +0 -0
  331. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/guides/use-case-dsl.md +0 -0
  332. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/api/core.rst +0 -0
  333. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/api/repository.rst +0 -0
  334. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/api/rest.rst +0 -0
  335. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/reference/api/testing.rst +0 -0
  336. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/requirements.txt +0 -0
  337. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/rest/autocrud.md +0 -0
  338. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/rest/testing.md +0 -0
  339. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/docs/rest/use-case-dsl.md +0 -0
  340. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/sonar-project.properties +0 -0
  341. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/__init__.py +0 -0
  342. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/__init__.py +0 -0
  343. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/auto.py +0 -0
  344. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/celery/constants.py +0 -0
  345. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/backend/__init__.py +0 -0
  346. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/backend/protocol.py +0 -0
  347. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  348. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/bootstrap/__init__.py +0 -0
  349. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  350. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/bootstrap/kernel.py +0 -0
  351. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/__init__.py +0 -0
  352. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/abc/__init__.py +0 -0
  353. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/abc/backend.py +0 -0
  354. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/abc/config.py +0 -0
  355. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/abc/dependency.py +0 -0
  356. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/codec.py +0 -0
  357. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/decorators.py +0 -0
  358. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/dependency.py +0 -0
  359. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/gateway.py +0 -0
  360. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/keys.py +0 -0
  361. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/repository.py +0 -0
  362. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/cache/serializer.py +0 -0
  363. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/command/__init__.py +0 -0
  364. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/command/adapter.py +0 -0
  365. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/command/base.py +0 -0
  366. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/command/field.py +0 -0
  367. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/command/introspection.py +0 -0
  368. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/errors.py +0 -0
  369. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/loader.py +0 -0
  370. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/model.py +0 -0
  371. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/config/resolver.py +0 -0
  372. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/contracts/__init__.py +0 -0
  373. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/contracts/manifest.py +0 -0
  374. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/di/__init__.py +0 -0
  375. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/di/container.py +0 -0
  376. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/di/scope.py +0 -0
  377. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/__init__.py +0 -0
  378. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/_utils.py +0 -0
  379. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/base.py +0 -0
  380. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/interfaces.py +0 -0
  381. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/manifest.py +0 -0
  382. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/discovery/modules.py +0 -0
  383. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/compilable.py +0 -0
  384. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/compiler.py +0 -0
  385. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/events.py +0 -0
  386. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/metrics.py +0 -0
  387. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/engine/plan.py +0 -0
  388. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/errors/__init__.py +0 -0
  389. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/errors/codes.py +0 -0
  390. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/errors/errors.py +0 -0
  391. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/__init__.py +0 -0
  392. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/callback.py +0 -0
  393. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/context.py +0 -0
  394. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/handle.py +0 -0
  395. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/job.py +0 -0
  396. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/job/service.py +0 -0
  397. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/logger/__init__.py +0 -0
  398. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/logger/abc.py +0 -0
  399. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/logger/registry.py +0 -0
  400. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/logger/structlogger.py +0 -0
  401. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/base.py +0 -0
  402. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/enums.py +0 -0
  403. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/field.py +0 -0
  404. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/introspection.py +0 -0
  405. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/projection.py +0 -0
  406. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/relation.py +0 -0
  407. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/timestamped.py +0 -0
  408. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/types.py +0 -0
  409. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/model/types_postgres.py +0 -0
  410. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/projection/__init__.py +0 -0
  411. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/projection/runtime.py +0 -0
  412. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/__init__.py +0 -0
  413. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/abc/__init__.py +0 -0
  414. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/abc/query.py +0 -0
  415. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  416. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/abc/repository.py +0 -0
  417. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/mutation.py +0 -0
  418. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/registration.py +0 -0
  419. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/registry.py +0 -0
  420. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  421. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  422. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  423. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  424. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  425. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  426. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  427. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  428. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  429. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  430. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  431. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  432. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  433. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  434. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  435. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  436. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  437. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  438. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  439. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  440. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/response/__init__.py +0 -0
  441. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/response/base.py +0 -0
  442. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/tracing/__init__.py +0 -0
  443. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/tracing/context.py +0 -0
  444. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/transport/__init__.py +0 -0
  445. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/transport/adapter.py +0 -0
  446. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/uow/__init__.py +0 -0
  447. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/uow/abc.py +0 -0
  448. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/uow/context.py +0 -0
  449. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/__init__.py +0 -0
  450. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/_predicates.py +0 -0
  451. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/compute.py +0 -0
  452. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/constants.py +0 -0
  453. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/factory.py +0 -0
  454. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/field_ref.py +0 -0
  455. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/invoker.py +0 -0
  456. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/keys.py +0 -0
  457. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/markers.py +0 -0
  458. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/registry.py +0 -0
  459. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/core/use_case/use_case.py +0 -0
  460. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/__init__.py +0 -0
  461. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_format_registry.py +0 -0
  462. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  463. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  464. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  465. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  466. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  467. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  468. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_merge.py +0 -0
  469. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_predicate.py +0 -0
  470. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  471. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  472. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  473. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/_write_policy.py +0 -0
  474. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  475. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  476. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  477. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  478. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  479. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  480. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  481. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  482. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  483. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  484. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  485. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  486. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  487. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  488. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  489. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  490. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  491. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  492. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  493. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/checkpoint/_store.py +0 -0
  494. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/__init__.py +0 -0
  495. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_binding.py +0 -0
  496. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_compiler.py +0 -0
  497. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_errors.py +0 -0
  498. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_plan.py +0 -0
  499. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_validators.py +0 -0
  500. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  501. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/compiler/_validators_step.py +0 -0
  502. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/__init__.py +0 -0
  503. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/_format.py +0 -0
  504. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/_read_options.py +0 -0
  505. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/_utils.py +0 -0
  506. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/_write_options.py +0 -0
  507. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  508. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  509. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  510. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  511. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  512. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  513. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  514. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_file.py +0 -0
  515. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  516. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  517. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  518. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  519. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  520. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  521. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  522. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_table.py +0 -0
  523. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  524. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  525. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/__init__.py +0 -0
  526. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_generics.py +0 -0
  527. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_params.py +0 -0
  528. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  529. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_process.py +0 -0
  530. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_sql.py +0 -0
  531. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_step.py +0 -0
  532. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  533. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/__init__.py +0 -0
  534. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/errors.py +0 -0
  535. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runner/filtering.py +0 -0
  536. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runtime/__init__.py +0 -0
  537. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/runtime/contracts.py +0 -0
  538. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/schema/__init__.py +0 -0
  539. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/schema/_contract.py +0 -0
  540. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/schema/_schema.py +0 -0
  541. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/storage/__init__.py +0 -0
  542. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/storage/_config.py +0 -0
  543. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/storage/_file_locator.py +0 -0
  544. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/storage/_locator.py +0 -0
  545. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/storage/routing.py +0 -0
  546. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/_result.py +0 -0
  547. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/_runners.py +0 -0
  548. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/etl/testing/_scenario.py +0 -0
  549. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/prometheus/adapter.py +0 -0
  550. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/prometheus/middleware.py +0 -0
  551. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/__init__.py +0 -0
  552. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/adapter.py +0 -0
  553. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/autocrud.py +0 -0
  554. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/compiler.py +0 -0
  555. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/constants.py +0 -0
  556. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/errors.py +0 -0
  557. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/__init__.py +0 -0
  558. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/openapi.py +0 -0
  559. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/fastapi/response.py +0 -0
  560. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/middleware.py +0 -0
  561. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/model.py +0 -0
  562. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/rest/rest_adapter.py +0 -0
  563. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/__init__.py +0 -0
  564. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/golden.py +0 -0
  565. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/http_harness.py +0 -0
  566. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/in_memory.py +0 -0
  567. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/src/loom/testing/repository_harness.py +0 -0
  568. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/__init__.py +0 -0
  569. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/conftest.py +0 -0
  570. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/golden/__init__.py +0 -0
  571. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/golden/baselines/.gitkeep +0 -0
  572. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/golden/outputs/.gitkeep +0 -0
  573. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/golden/plans/.gitkeep +0 -0
  574. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/helpers/__init__.py +0 -0
  575. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/__init__.py +0 -0
  576. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
  577. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  578. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  579. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/conftest.py +0 -0
  580. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/__init__.py +0 -0
  581. {loom_kernel-0.4.0/tests/integration/core/repository → loom_kernel-0.6.0/tests/integration/core/bootstrap}/__init__.py +0 -0
  582. {loom_kernel-0.4.0/tests/integration/core/repository/sqlalchemy → loom_kernel-0.6.0/tests/integration/core/repository}/__init__.py +0 -0
  583. {loom_kernel-0.4.0/tests/integration/core/rest → loom_kernel-0.6.0/tests/integration/core/repository/sqlalchemy}/__init__.py +0 -0
  584. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  585. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  586. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  587. {loom_kernel-0.4.0/tests/integration/fake_repo → loom_kernel-0.6.0/tests/integration/core/rest}/__init__.py +0 -0
  588. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  589. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  590. {loom_kernel-0.4.0/tests/integration/fake_repo/product/category → loom_kernel-0.6.0/tests/integration/core/use_case}/__init__.py +0 -0
  591. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  592. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  593. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/etl/__init__.py +0 -0
  594. {loom_kernel-0.4.0/tests/integration/fake_repo/product/review → loom_kernel-0.6.0/tests/integration/fake_repo}/__init__.py +0 -0
  595. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/config/__init__.py +0 -0
  596. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  597. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  598. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/main.py +0 -0
  599. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/manifest.py +0 -0
  600. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/__init__.py +0 -0
  601. {loom_kernel-0.4.0/tests/unit/celery_bootstrap → loom_kernel-0.6.0/tests/integration/fake_repo/product/category}/__init__.py +0 -0
  602. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/category/model.py +0 -0
  603. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  604. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/interface.py +0 -0
  605. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/jobs.py +0 -0
  606. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/model.py +0 -0
  607. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/relations.py +0 -0
  608. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/repository.py +0 -0
  609. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  610. {loom_kernel-0.4.0/tests/unit/celery_jobs → loom_kernel-0.6.0/tests/integration/fake_repo/product/review}/__init__.py +0 -0
  611. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/review/model.py +0 -0
  612. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  613. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/schemas.py +0 -0
  614. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
  615. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/support/__init__.py +0 -0
  616. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
  617. {loom_kernel-0.4.0/tests/unit/core/backend → loom_kernel-0.6.0/tests/unit}/__init__.py +0 -0
  618. {loom_kernel-0.4.0/tests/unit/core/bootstrap → loom_kernel-0.6.0/tests/unit/celery_bootstrap}/__init__.py +0 -0
  619. {loom_kernel-0.4.0/tests/unit/core/command → loom_kernel-0.6.0/tests/unit/celery_jobs}/__init__.py +0 -0
  620. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/celery_jobs/test_auto.py +0 -0
  621. {loom_kernel-0.4.0/tests/unit/core/config → loom_kernel-0.6.0/tests/unit/core}/__init__.py +0 -0
  622. {loom_kernel-0.4.0/tests/unit/core/di → loom_kernel-0.6.0/tests/unit/core/backend}/__init__.py +0 -0
  623. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  624. {loom_kernel-0.4.0/tests/unit/core/engine → loom_kernel-0.6.0/tests/unit/core/bootstrap}/__init__.py +0 -0
  625. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  626. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  627. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  628. {loom_kernel-0.4.0/tests/unit/core/errors → loom_kernel-0.6.0/tests/unit/core/cache}/__init__.py +0 -0
  629. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
  630. {loom_kernel-0.4.0/tests/unit/core/job → loom_kernel-0.6.0/tests/unit/core/command}/__init__.py +0 -0
  631. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/command/test_command_base.py +0 -0
  632. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/command/test_command_field.py +0 -0
  633. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/command/test_command_patch.py +0 -0
  634. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/command/test_introspection.py +0 -0
  635. {loom_kernel-0.4.0/tests/unit/core/model → loom_kernel-0.6.0/tests/unit/core/config}/__init__.py +0 -0
  636. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/config/test_config.py +0 -0
  637. {loom_kernel-0.4.0/tests/unit/core/tracing → loom_kernel-0.6.0/tests/unit/core/di}/__init__.py +0 -0
  638. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/di/test_container.py +0 -0
  639. {loom_kernel-0.4.0/tests/unit/core/uow → loom_kernel-0.6.0/tests/unit/core/discovery}/__init__.py +0 -0
  640. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/discovery/test_manifest.py +0 -0
  641. {loom_kernel-0.4.0/tests/unit/core/use_case → loom_kernel-0.6.0/tests/unit/core/engine}/__init__.py +0 -0
  642. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_compiler.py +0 -0
  643. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_executor.py +0 -0
  644. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
  645. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
  646. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_metrics.py +0 -0
  647. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/engine/test_plan.py +0 -0
  648. {loom_kernel-0.4.0/tests/unit/etl → loom_kernel-0.6.0/tests/unit/core/errors}/__init__.py +0 -0
  649. {loom_kernel-0.4.0/tests/unit/etl/backends/test_polars → loom_kernel-0.6.0/tests/unit/core/expr}/__init__.py +0 -0
  650. {loom_kernel-0.4.0/tests/unit/etl/backends/test_spark → loom_kernel-0.6.0/tests/unit/core/job}/__init__.py +0 -0
  651. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/conftest.py +0 -0
  652. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/test_callback.py +0 -0
  653. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/test_context.py +0 -0
  654. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/test_handle.py +0 -0
  655. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/test_inline_service.py +0 -0
  656. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/job/test_job.py +0 -0
  657. {loom_kernel-0.4.0/tests/unit/etl/checkpoint → loom_kernel-0.6.0/tests/unit/core/logger}/__init__.py +0 -0
  658. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/logger/test_registry.py +0 -0
  659. {loom_kernel-0.4.0/tests/unit/etl/compiler → loom_kernel-0.6.0/tests/unit/core/model}/__init__.py +0 -0
  660. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/model/test_model.py +0 -0
  661. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/model/test_struct.py +0 -0
  662. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/model/test_timestamped.py +0 -0
  663. {loom_kernel-0.4.0/tests/unit/etl/io → loom_kernel-0.6.0/tests/unit/core/observability}/__init__.py +0 -0
  664. {loom_kernel-0.4.0/tests/unit/etl/schema → loom_kernel-0.6.0/tests/unit/core/projection}/__init__.py +0 -0
  665. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/projection/test_runtime.py +0 -0
  666. {loom_kernel-0.4.0/tests/unit/etl/sql → loom_kernel-0.6.0/tests/unit/core/repository}/__init__.py +0 -0
  667. {loom_kernel-0.4.0/tests/unit/etl/storage → loom_kernel-0.6.0/tests/unit/core/repository/abc}/__init__.py +0 -0
  668. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/abc/conftest.py +0 -0
  669. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/abc/test_query.py +0 -0
  670. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  671. {loom_kernel-0.4.0/tests/unit/prometheus → loom_kernel-0.6.0/tests/unit/core/repository/sqlalchemy}/__init__.py +0 -0
  672. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  673. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  674. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  675. {loom_kernel-0.4.0/tests/unit/rest → loom_kernel-0.6.0/tests/unit/core/routing}/__init__.py +0 -0
  676. {loom_kernel-0.4.0/tests/unit/testing → loom_kernel-0.6.0/tests/unit/core/tracing}/__init__.py +0 -0
  677. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/tracing/test_context.py +0 -0
  678. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
  679. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  680. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  681. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_compute.py +0 -0
  682. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_factory.py +0 -0
  683. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
  684. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_invoker.py +0 -0
  685. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_markers.py +0 -0
  686. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_rule.py +0 -0
  687. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/core/use_case/test_use_case.py +0 -0
  688. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
  689. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
  690. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  691. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  692. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  693. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  694. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  695. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  696. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  697. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  698. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  699. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  700. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  701. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  702. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  703. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  704. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  705. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  706. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  707. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  708. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
  709. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  710. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
  711. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  712. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  713. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_errors.py +0 -0
  714. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  715. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  716. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  717. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  718. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  719. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  720. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_structural.py +0 -0
  721. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  722. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  723. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/conftest.py +0 -0
  724. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_source_json.py +0 -0
  725. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_source_options.py +0 -0
  726. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_utils.py +0 -0
  727. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/io/test_variants.py +0 -0
  728. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/pipeline/__init__.py +0 -0
  729. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  730. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  731. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/pipeline/test_step.py +0 -0
  732. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/schema/test_contract.py +0 -0
  733. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/schema/test_schema.py +0 -0
  734. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/schema/test_table.py +0 -0
  735. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/sql/test_merge.py +0 -0
  736. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/sql/test_predicate.py +0 -0
  737. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  738. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  739. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  740. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_locator.py +0 -0
  741. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_route_build.py +0 -0
  742. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  743. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
  744. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_format_registry.py +0 -0
  745. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_runner_errors.py +0 -0
  746. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/test_spark_testing.py +0 -0
  747. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/testing/test_runners.py +0 -0
  748. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  749. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/prometheus/test_adapter.py +0 -0
  750. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/prometheus/test_middleware.py +0 -0
  751. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_autocrud.py +0 -0
  752. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_middleware.py +0 -0
  753. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  754. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_response.py +0 -0
  755. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_rest_adapter.py +0 -0
  756. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_rest_compiler.py +0 -0
  757. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/rest/test_rest_model.py +0 -0
  758. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/testing/test_golden.py +0 -0
  759. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/testing/test_http_harness.py +0 -0
  760. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/testing/test_in_memory.py +0 -0
  761. {loom_kernel-0.4.0 → loom_kernel-0.6.0}/tests/unit/testing/test_runner.py +0 -0
@@ -88,7 +88,7 @@ jobs:
88
88
  uv export --frozen --only-group dev --no-hashes --no-emit-project \
89
89
  -o "$MANIFEST_DIR/requirements-dev.txt"
90
90
 
91
- for extra in rest sqlalchemy config cache pyspark prometheus celery; do
91
+ for extra in rest sqlalchemy config cache pyspark prometheus celery streaming; do
92
92
  uv export --frozen --no-default-groups --no-dev --extra "$extra" \
93
93
  --no-hashes --no-emit-project \
94
94
  -o "$MANIFEST_DIR/requirements-extra-${extra}.txt"
@@ -103,7 +103,7 @@ jobs:
103
103
  --file="$MANIFEST_DIR/requirements-dev.txt" --package-manager=pip \
104
104
  --project-name="loom-py/dev" --target-reference="${GITHUB_REF_NAME:-master}"
105
105
 
106
- for extra in rest sqlalchemy config cache pyspark prometheus celery; do
106
+ for extra in rest sqlalchemy config cache pyspark prometheus celery streaming; do
107
107
  python -m pip install -r "$MANIFEST_DIR/requirements-extra-${extra}.txt"
108
108
  snyk monitor --skip-unresolved \
109
109
  --file="$MANIFEST_DIR/requirements-extra-${extra}.txt" \
@@ -142,7 +142,7 @@ jobs:
142
142
  uv export --frozen --only-group dev --no-hashes --no-emit-project \
143
143
  -o "$MANIFEST_DIR/requirements-dev.txt"
144
144
 
145
- for extra in rest sqlalchemy config cache pyspark prometheus celery; do
145
+ for extra in rest sqlalchemy config cache pyspark prometheus celery streaming; do
146
146
  uv export --frozen --no-default-groups --no-dev --extra "$extra" \
147
147
  --no-hashes --no-emit-project \
148
148
  -o "$MANIFEST_DIR/requirements-extra-${extra}.txt"
@@ -162,7 +162,7 @@ jobs:
162
162
  --package-manager=pip \
163
163
  --project-name="loom-py/dev"
164
164
 
165
- for extra in rest sqlalchemy config cache pyspark prometheus celery; do
165
+ for extra in rest sqlalchemy config cache pyspark prometheus celery streaming; do
166
166
  python -m pip install -r "$MANIFEST_DIR/requirements-extra-${extra}.txt"
167
167
  snyk test --severity-threshold=high \
168
168
  --skip-unresolved \
@@ -16,6 +16,7 @@ wheels/
16
16
  coverage.xml
17
17
  htmlcov/
18
18
  .vscode/
19
+ .pi/
19
20
  docs/__pycache__/
20
21
  .claude/
21
22
  .claude.md
@@ -1,3 +1,148 @@
1
+ # 🚀 Release 0.6.0 ([#22](https://github.com/the-reacher-data/loom-py/pull/22)) ([`5146569`](https://github.com/the-reacher-data/loom-py/commit/51465697115036ed05f620a1099272e4fd216501))
2
+
3
+
4
+ ## ✨ Features
5
+ ### core
6
+ - **core:** add unified ObservabilityRuntime<br>
7
+ > Introduces the core observability package: LifecycleEvent, LifecycleObserver
8
+ > protocol, ObservabilityConfig, and ObservabilityRuntime as a single fan-out
9
+ > engine replacing the fragmented per-module observer wiring. Adds
10
+ > StructlogLifecycleObserver, OtelLifecycleObserver, NoopObserver, and
11
+ > PrometheusLifecycleAdapter (with Pushgateway support for ETL batch jobs).
12
+ > Backward-compat re-exports (safe_observe, notify_observers) kept for the
13
+ > streaming composite observer until the legacy cleanup commit.
14
+
15
+
16
+
17
+ ## 🐛 Fixes
18
+ ### observability
19
+ - **observability:** restore default bootstraps
20
+
21
+ ### rest
22
+ - **rest:** correct camel-to-snake conversion for acronyms in filter fields
23
+
24
+ ### streaming
25
+ - **streaming:** propagate trace ids through bytewax paths
26
+ - **streaming:** keep input trace ids through the micro
27
+ - **streaming:** bridge otel trace ids from messages
28
+
29
+
30
+ ## 📖 Documentation
31
+ - align yaml config and dummy repo links
32
+ - restore dummy repo urls
33
+ - fix markdown links for streaming dummies
34
+
35
+ ### prometheus
36
+ - **prometheus:** update KafkaPrometheusMetrics docstring metric names
37
+
38
+
39
+
40
+ ## ♻️ Refactor
41
+ ### observability
42
+ - **observability:** simplify otel log correlation
43
+ - **observability:** simplify otel exporter imports
44
+ - **observability:** expose ObservabilityRuntime in public API and clean architecture debt<br>
45
+ > Export ObservabilityRuntime and LifecycleStatus from loom.core.observability package
46
+ > Compute dict(meta) once in span() instead of three separate allocations
47
+ > Replace _SIGNALS_CONNECTED module-level global with ClassVar on _CeleryAsyncRuntime
48
+ > Add RuntimeError to bootstrap_worker Raises docstring
49
+ > Fix TraceIdMiddleware docstring example (removed spurious ObservabilityRuntime reference)
50
+ > Add missing observability_runtime param to _make_handler docstring
51
+
52
+ - **observability:** unify runtime across services
53
+ - **observability:** clean up dead code and docs
54
+
55
+ ### streaming
56
+ - **streaming:** migrate to unified ObservabilityRuntime<br>
57
+ > Replace StreamingObservabilityConfig and the manual observer construction
58
+ > in _load_observability_runtime() with ObservabilityRuntime.from_config().
59
+ > Observability config now lives under streaming.runtime.observability in YAML,
60
+ > eliminating the separate streaming.observability section.
61
+ > Delete src/loom/streaming/_observability.py (StreamingObservabilityConfig)
62
+ > Delete src/loom/streaming/observability/ directory (old observer stack)
63
+ > Add observability: ObservabilityConfig field to BytewaxRuntimeConfig
64
+ > StreamingRunner.from_config() calls ObservabilityRuntime.from_config() directly
65
+ > StreamingTestRunner defaults to ObservabilityRuntime.noop(); callers pass
66
+ > observability_runtime= explicitly when needed
67
+ > Update tests to use new config shape and ObservabilityRuntime([observer])
68
+
69
+ - **streaming:** replace KafkaStreamingObserver with LifecycleEvent/TRANSPORT<br>
70
+ > Eliminates the parallel KafkaStreamingObserver protocol hierarchy (NoopKafkaObserver,
71
+ > StructlogKafkaObserver) and models all Kafka transport events as LifecycleEvent with
72
+ > Scope.TRANSPORT. KafkaPrometheusMetrics now implements the LifecycleObserver protocol
73
+ > via a single on_event() dispatcher instead of four typed callback methods.
74
+
75
+ - **streaming:** preserve trace lineage across boundaries
76
+
77
+ ### prometheus
78
+ - **prometheus:** add KafkaMetricName enum and drop loom_ prefix<br>
79
+ > Extracts Prometheus metric names into a public KafkaMetricName StrEnum so
80
+ > callers can reference metric names without magic strings. Removes the loom_
81
+ > namespace prefix from all four Kafka instruments (produced_total,
82
+ > consumed_total, encode_duration_seconds, decode_duration_seconds).
83
+
84
+ - **prometheus:** drop loom prefix from lifecycle metrics
85
+
86
+ ### rest
87
+ - **rest:** use core observability runtime
88
+ - **rest:** read prometheus from observability config
89
+
90
+ ### celery
91
+ - **celery:** adopt async bridge and runtime config
92
+
93
+ ### etl
94
+ - **etl:** make spark pytest plugin opt-in
95
+
96
+
97
+
98
+ ## ✅ Tests
99
+ ### kafka
100
+ - **kafka:** update metric name assertions after loom_ prefix removal
101
+
102
+ ### observability
103
+ - **observability:** cover lineage and runtime branches
104
+
105
+ ### integration
106
+ - **integration:** add in-memory REST, observability, and bootstrap integration tests
107
+
108
+ ### etl
109
+ - **etl:** cover prometheus flush on runner shutdown
110
+
111
+
112
+ ## 🛠 Chores
113
+ ### deps
114
+ - **deps:** bump click to 8.3.3
115
+
116
+
117
+
118
+
119
+ # 🚀 Release 0.5.0 ([#20](https://github.com/the-reacher-data/loom-py/pull/20)) ([`70f7cf8`](https://github.com/the-reacher-data/loom-py/commit/70f7cf85275fcc1f590e06f980dfac91cad50893))
120
+
121
+
122
+ ## ✨ Features
123
+ ### core
124
+ - **core:** add shared expression routing primitives
125
+
126
+ ### streaming
127
+ - **streaming:** add process DSL and routing
128
+ - **streaming:** add kafka transport and observability
129
+ - **streaming:** allow task resource kwargs
130
+ - **streaming:** add scoped dependency nodes
131
+ - **streaming:** make tasks configurable
132
+
133
+ ### config
134
+ - **config:** add declarative config bindings
135
+
136
+
137
+
138
+
139
+
140
+
141
+
142
+
143
+
144
+
145
+
1
146
  # 🚀 Release 0.4.0 ([#18](https://github.com/the-reacher-data/loom-py/pull/18)) ([`09e5aa3`](https://github.com/the-reacher-data/loom-py/commit/09e5aa340f88e0488daca2bf10320aad7aebbe1d))
2
147
 
3
148
 
@@ -0,0 +1,116 @@
1
+ # 🚀 Release 0.6.0 ([#22](https://github.com/the-reacher-data/loom-py/pull/22)) ([`5146569`](https://github.com/the-reacher-data/loom-py/commit/51465697115036ed05f620a1099272e4fd216501))
2
+
3
+
4
+ ## ✨ Features
5
+ ### core
6
+ - **core:** add unified ObservabilityRuntime<br>
7
+ > Introduces the core observability package: LifecycleEvent, LifecycleObserver
8
+ > protocol, ObservabilityConfig, and ObservabilityRuntime as a single fan-out
9
+ > engine replacing the fragmented per-module observer wiring. Adds
10
+ > StructlogLifecycleObserver, OtelLifecycleObserver, NoopObserver, and
11
+ > PrometheusLifecycleAdapter (with Pushgateway support for ETL batch jobs).
12
+ > Backward-compat re-exports (safe_observe, notify_observers) kept for the
13
+ > streaming composite observer until the legacy cleanup commit.
14
+
15
+
16
+
17
+ ## 🐛 Fixes
18
+ ### observability
19
+ - **observability:** restore default bootstraps
20
+
21
+ ### rest
22
+ - **rest:** correct camel-to-snake conversion for acronyms in filter fields
23
+
24
+ ### streaming
25
+ - **streaming:** propagate trace ids through bytewax paths
26
+ - **streaming:** keep input trace ids through the micro
27
+ - **streaming:** bridge otel trace ids from messages
28
+
29
+
30
+ ## 📖 Documentation
31
+ - align yaml config and dummy repo links
32
+ - restore dummy repo urls
33
+ - fix markdown links for streaming dummies
34
+
35
+ ### prometheus
36
+ - **prometheus:** update KafkaPrometheusMetrics docstring metric names
37
+
38
+
39
+
40
+ ## ♻️ Refactor
41
+ ### observability
42
+ - **observability:** simplify otel log correlation
43
+ - **observability:** simplify otel exporter imports
44
+ - **observability:** expose ObservabilityRuntime in public API and clean architecture debt<br>
45
+ > Export ObservabilityRuntime and LifecycleStatus from loom.core.observability package
46
+ > Compute dict(meta) once in span() instead of three separate allocations
47
+ > Replace _SIGNALS_CONNECTED module-level global with ClassVar on _CeleryAsyncRuntime
48
+ > Add RuntimeError to bootstrap_worker Raises docstring
49
+ > Fix TraceIdMiddleware docstring example (removed spurious ObservabilityRuntime reference)
50
+ > Add missing observability_runtime param to _make_handler docstring
51
+
52
+ - **observability:** unify runtime across services
53
+ - **observability:** clean up dead code and docs
54
+
55
+ ### streaming
56
+ - **streaming:** migrate to unified ObservabilityRuntime<br>
57
+ > Replace StreamingObservabilityConfig and the manual observer construction
58
+ > in _load_observability_runtime() with ObservabilityRuntime.from_config().
59
+ > Observability config now lives under streaming.runtime.observability in YAML,
60
+ > eliminating the separate streaming.observability section.
61
+ > Delete src/loom/streaming/_observability.py (StreamingObservabilityConfig)
62
+ > Delete src/loom/streaming/observability/ directory (old observer stack)
63
+ > Add observability: ObservabilityConfig field to BytewaxRuntimeConfig
64
+ > StreamingRunner.from_config() calls ObservabilityRuntime.from_config() directly
65
+ > StreamingTestRunner defaults to ObservabilityRuntime.noop(); callers pass
66
+ > observability_runtime= explicitly when needed
67
+ > Update tests to use new config shape and ObservabilityRuntime([observer])
68
+
69
+ - **streaming:** replace KafkaStreamingObserver with LifecycleEvent/TRANSPORT<br>
70
+ > Eliminates the parallel KafkaStreamingObserver protocol hierarchy (NoopKafkaObserver,
71
+ > StructlogKafkaObserver) and models all Kafka transport events as LifecycleEvent with
72
+ > Scope.TRANSPORT. KafkaPrometheusMetrics now implements the LifecycleObserver protocol
73
+ > via a single on_event() dispatcher instead of four typed callback methods.
74
+
75
+ - **streaming:** preserve trace lineage across boundaries
76
+
77
+ ### prometheus
78
+ - **prometheus:** add KafkaMetricName enum and drop loom_ prefix<br>
79
+ > Extracts Prometheus metric names into a public KafkaMetricName StrEnum so
80
+ > callers can reference metric names without magic strings. Removes the loom_
81
+ > namespace prefix from all four Kafka instruments (produced_total,
82
+ > consumed_total, encode_duration_seconds, decode_duration_seconds).
83
+
84
+ - **prometheus:** drop loom prefix from lifecycle metrics
85
+
86
+ ### rest
87
+ - **rest:** use core observability runtime
88
+ - **rest:** read prometheus from observability config
89
+
90
+ ### celery
91
+ - **celery:** adopt async bridge and runtime config
92
+
93
+ ### etl
94
+ - **etl:** make spark pytest plugin opt-in
95
+
96
+
97
+
98
+ ## ✅ Tests
99
+ ### kafka
100
+ - **kafka:** update metric name assertions after loom_ prefix removal
101
+
102
+ ### observability
103
+ - **observability:** cover lineage and runtime branches
104
+
105
+ ### integration
106
+ - **integration:** add in-memory REST, observability, and bootstrap integration tests
107
+
108
+ ### etl
109
+ - **etl:** cover prometheus flush on runner shutdown
110
+
111
+
112
+ ## 🛠 Chores
113
+ ### deps
114
+ - **deps:** bump click to 8.3.3
115
+
116
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loom-kernel
3
- Version: 0.4.0
3
+ Version: 0.6.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -54,6 +54,15 @@ Requires-Dist: uvicorn<1.0,>=0.30; extra == 'rest'
54
54
  Requires-Dist: uvloop<1.0,>=0.21; (sys_platform != 'win32') and extra == 'rest'
55
55
  Provides-Extra: sqlalchemy
56
56
  Requires-Dist: sqlalchemy<3.0,>=2.0; extra == 'sqlalchemy'
57
+ Provides-Extra: streaming
58
+ Requires-Dist: anyio<5.0,>=4.0; extra == 'streaming'
59
+ Requires-Dist: bytewax>=0.21; extra == 'streaming'
60
+ Requires-Dist: confluent-kafka<3.0,>=2.6; extra == 'streaming'
61
+ Requires-Dist: opentelemetry-api<2.0,>=1.27; extra == 'streaming'
62
+ Requires-Dist: opentelemetry-exporter-otlp-proto-grpc<2.0,>=1.27; extra == 'streaming'
63
+ Requires-Dist: opentelemetry-exporter-otlp-proto-http<2.0,>=1.27; extra == 'streaming'
64
+ Requires-Dist: opentelemetry-sdk<2.0,>=1.27; extra == 'streaming'
65
+ Requires-Dist: uvloop<1.0,>=0.21; (sys_platform != 'win32') and extra == 'streaming'
57
66
  Description-Content-Type: text/markdown
58
67
 
59
68
  <p align="center">
@@ -387,8 +396,13 @@ app:
387
396
  database:
388
397
  url: ${oc.env:DATABASE_URL,sqlite+aiosqlite:///store.db}
389
398
 
390
- metrics:
391
- enabled: false
399
+ observability:
400
+ log:
401
+ enabled: false
402
+ otel:
403
+ enabled: false
404
+ prometheus:
405
+ enabled: false
392
406
  ```
393
407
 
394
408
  ```python
@@ -329,8 +329,13 @@ app:
329
329
  database:
330
330
  url: ${oc.env:DATABASE_URL,sqlite+aiosqlite:///store.db}
331
331
 
332
- metrics:
333
- enabled: false
332
+ observability:
333
+ log:
334
+ enabled: false
335
+ otel:
336
+ enabled: false
337
+ prometheus:
338
+ enabled: false
334
339
  ```
335
340
 
336
341
  ```python
@@ -69,6 +69,8 @@ def _skip_duplicate_reexports(
69
69
  ("loom.core.errors", "RuleViolations"),
70
70
  ("loom.core.use_case", "RuleViolation"),
71
71
  ("loom.core.use_case", "RuleViolations"),
72
+ ("loom.etl.lineage", "ETLObservabilityConfig"),
73
+ ("loom.testing", "CompilationError"),
72
74
  ("loom.rest.model", "PaginationMode"),
73
75
  }
74
76
  if (current_module, name) in duplicated_reexports:
@@ -165,9 +165,15 @@ storage:
165
165
  tmp_root: /var/lib/loom/lake/_tmp
166
166
 
167
167
  observability:
168
- log: true
169
- slow_step_threshold_ms: 30000
170
- run_sink:
168
+ log:
169
+ enabled: true
170
+ otel:
171
+ enabled: false
172
+ prometheus:
173
+ enabled: true
174
+ pushgateway_url: ${oc.env:PUSHGATEWAY_URL,http://127.0.0.1:9091}
175
+ lineage:
176
+ enabled: true
171
177
  # Choose exactly one destination:
172
178
  root: /var/lib/loom/lake/_runs
173
179
  # database: ops
@@ -42,7 +42,8 @@ def test_double_amount(loom_polars_runner):
42
42
  result.assert_count(2)
43
43
  ```
44
44
 
45
- Pytest fixtures auto-registered: `loom_polars_runner`, `loom_spark_runner`.
45
+ Pytest fixtures: `loom_polars_runner`. Import `loom.etl.testing.spark` or
46
+ register it explicitly in Spark-enabled suites to use `loom_spark_runner`.
46
47
 
47
48
  ## Spark integration tests
48
49
 
@@ -578,12 +578,15 @@ app:
578
578
  database:
579
579
  url: ${oc.env:DATABASE_URL,sqlite+aiosqlite:///./store.db}
580
580
 
581
- trace:
582
- enabled: ${oc.decode:${oc.env:TRACE_ENABLED,true}}
583
-
584
- metrics:
585
- enabled: ${oc.decode:${oc.env:METRICS_ENABLED,true}}
586
- path: /metrics
581
+ observability:
582
+ log:
583
+ enabled: true
584
+ otel:
585
+ enabled: false
586
+ prometheus:
587
+ enabled: ${oc.decode:${oc.env:METRICS_ENABLED,true}}
588
+ config:
589
+ path: /metrics
587
590
  ```
588
591
 
589
592
  ### Manifest mode (explicit registry)
@@ -90,9 +90,15 @@ storage:
90
90
  tmp_root: /var/lib/loom/lake/_tmp
91
91
 
92
92
  observability:
93
- log: true
94
- slow_step_threshold_ms: 30000
95
- run_sink:
93
+ log:
94
+ enabled: true
95
+ otel:
96
+ enabled: false
97
+ prometheus:
98
+ enabled: true
99
+ pushgateway_url: ${oc.env:PUSHGATEWAY_URL,http://127.0.0.1:9091}
100
+ lineage:
101
+ enabled: true
96
102
  root: /var/lib/loom/lake/_runs
97
103
  ```
98
104
 
@@ -1,4 +1,4 @@
1
- # Quickstart
1
+ # REST Quickstart
2
2
 
3
3
  `loom-kernel` lets you define business behavior in typed use cases and expose it
4
4
  through REST interfaces — with full auto-CRUD, background jobs, and Celery workers.
@@ -58,6 +58,12 @@ app:
58
58
 
59
59
  database:
60
60
  url: ${oc.env:DATABASE_URL,sqlite+aiosqlite:///store.db}
61
+
62
+ observability:
63
+ log:
64
+ enabled: false
65
+ otel:
66
+ enabled: false
61
67
  ```
62
68
 
63
69
  ```python
@@ -330,12 +336,15 @@ app:
330
336
  database:
331
337
  url: ${oc.env:DATABASE_URL,sqlite+aiosqlite:///store.db}
332
338
 
333
- metrics:
334
- enabled: true
335
- path: /metrics
336
-
337
- trace:
338
- enabled: true
339
+ observability:
340
+ log:
341
+ enabled: true
342
+ otel:
343
+ enabled: false
344
+ prometheus:
345
+ enabled: true
346
+ config:
347
+ path: /metrics
339
348
  ```
340
349
 
341
350
  ```python
@@ -0,0 +1,97 @@
1
+ # Streaming Quickstart
2
+
3
+ `loom.streaming` lets you declare typed streaming flows with explicit sources,
4
+ steps, batching, branching, and transport wiring.
5
+
6
+ The companion demo repository for this subsystem is
7
+ [dummy-loom-streaming](https://github.com/the-reacher-data/dummy-loom-streaming).
8
+
9
+ ## Install
10
+
11
+ Choose the streaming runtime and Kafka transport:
12
+
13
+ ```bash
14
+ pip install "loom-kernel[streaming,kafka]"
15
+ ```
16
+
17
+ ## Minimal flow
18
+
19
+ ```python
20
+ from loom.streaming import (
21
+ CollectBatch,
22
+ FromTopic,
23
+ IntoTopic,
24
+ Process,
25
+ StreamFlow,
26
+ WithAsync,
27
+ payload,
28
+ )
29
+
30
+ from app.streaming.tasks import FetchRequestTask
31
+ from app.streaming.types import ScrapeRequest, ScrapeResponse
32
+
33
+
34
+ async_scrape_flow = StreamFlow(
35
+ name="async_smoke_flow",
36
+ source=FromTopic[ScrapeRequest](
37
+ name="scrape.requests",
38
+ payload=ScrapeRequest,
39
+ ),
40
+ process=Process(
41
+ CollectBatch(max_records=50, timeout_ms=2000),
42
+ WithAsync(
43
+ process=Process(
44
+ FetchRequestTask,
45
+ IntoTopic[ScrapeResponse](
46
+ name="scrape.responses",
47
+ payload=ScrapeResponse,
48
+ ),
49
+ ),
50
+ max_concurrency=50,
51
+ ),
52
+ ),
53
+ )
54
+ ```
55
+
56
+ ## Run it
57
+
58
+ Use the Bytewax runner to compile the flow, resolve YAML bindings, and execute
59
+ the graph:
60
+
61
+ ```python
62
+ from loom.streaming.bytewax import StreamingRunner
63
+
64
+ runner = StreamingRunner.from_yaml(async_scrape_flow, "config/streaming.yaml")
65
+ runner.run()
66
+ ```
67
+
68
+ ## Public imports
69
+
70
+ Prefer the public surface:
71
+
72
+ ```python
73
+ from loom.streaming import (
74
+ Broadcast,
75
+ CollectBatch,
76
+ ContextFactory,
77
+ Fork,
78
+ FromTopic,
79
+ IntoTopic,
80
+ Message,
81
+ Process,
82
+ RecordStep,
83
+ Router,
84
+ StreamFlow,
85
+ With,
86
+ WithAsync,
87
+ msg,
88
+ payload,
89
+ )
90
+ ```
91
+
92
+ Use `loom.streaming.nodes`, `loom.streaming.kafka`, and
93
+ `loom.streaming.bytewax` only when you need a narrower or runtime-specific
94
+ surface.
95
+
96
+ For a runnable end-to-end example, see the companion repository:
97
+ [dummy-loom-streaming](https://github.com/the-reacher-data/dummy-loom-streaming).
@@ -282,6 +282,12 @@ celery:
282
282
 
283
283
  # For integration tests: run tasks synchronously in the calling process.
284
284
  task_always_eager: false
285
+
286
+ # Async bridge settings used by async jobs/callbacks.
287
+ runtime:
288
+ backend: asyncio # asyncio or trio
289
+ use_uvloop: true # only applies to asyncio on supported platforms
290
+ shutdown_timeout_ms: 10000
285
291
  ```
286
292
 
287
293
  (per-job-overrides-from-yaml)=
@@ -497,6 +503,9 @@ celery:
497
503
  broker_url: "redis://localhost:6379/15"
498
504
  result_backend: "redis://localhost:6379/15"
499
505
  task_always_eager: true
506
+ runtime:
507
+ backend: asyncio
508
+ use_uvloop: false
500
509
  ```
501
510
 
502
511
  Or patch it in a pytest fixture:
@@ -165,9 +165,15 @@ storage:
165
165
  tmp_root: /var/lib/loom/lake/_tmp
166
166
 
167
167
  observability:
168
- log: true
169
- slow_step_threshold_ms: 30000
170
- run_sink:
168
+ log:
169
+ enabled: true
170
+ otel:
171
+ enabled: false
172
+ prometheus:
173
+ enabled: true
174
+ pushgateway_url: ${oc.env:PUSHGATEWAY_URL,http://127.0.0.1:9091}
175
+ lineage:
176
+ enabled: true
171
177
  # Choose exactly one destination:
172
178
  root: /var/lib/loom/lake/_runs
173
179
  # database: ops
@@ -0,0 +1,7 @@
1
+ # REST Quickstart
2
+
3
+ The canonical REST quickstart lives in
4
+ [getting-started/rest](../getting-started/rest.md).
5
+
6
+ Use the REST quickstart for model-driven APIs, auto-CRUD, use cases, jobs, and
7
+ FastAPI delivery.
@@ -42,12 +42,19 @@ Official hosted documentation:
42
42
  Companion demo application:
43
43
  `dummy-loom <https://github.com/the-reacher-data/dummy-loom>`_.
44
44
 
45
+ .. toctree::
46
+ :maxdepth: 2
47
+ :caption: Overview
48
+
49
+ overview
50
+
45
51
  .. toctree::
46
52
  :maxdepth: 2
47
53
  :caption: Getting Started
48
54
 
49
55
  getting-started/rest
50
56
  getting-started/etl
57
+ getting-started/streaming
51
58
 
52
59
  .. toctree::
53
60
  :maxdepth: 2
@@ -67,6 +74,12 @@ Companion demo application:
67
74
  etl/testing
68
75
  etl/examples
69
76
 
77
+ .. toctree::
78
+ :maxdepth: 2
79
+ :caption: Streaming
80
+
81
+ streaming/bytewax
82
+
70
83
  .. toctree::
71
84
  :maxdepth: 2
72
85
  :caption: Reference