loom-kernel 0.6.0__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (745) hide show
  1. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/CHANGELOG.md +98 -0
  2. loom_kernel-0.7.0/CHANGELOG_RELEASE.md +96 -0
  3. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/PKG-INFO +1 -1
  4. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/pyproject.toml +2 -2
  5. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/bootstrap.py +68 -45
  6. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/config.py +0 -10
  7. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/runner.py +1 -6
  8. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/async_bridge.py +25 -7
  9. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/config.py +3 -1
  10. loom_kernel-0.7.0/src/loom/core/compiler.py +24 -0
  11. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/__init__.py +6 -0
  12. loom_kernel-0.7.0/src/loom/core/config/binder.py +100 -0
  13. loom_kernel-0.7.0/src/loom/core/config/context.py +232 -0
  14. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/keys.py +4 -0
  15. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/config.py +8 -4
  16. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/query.py +11 -14
  17. loom_kernel-0.7.0/src/loom/core/runner.py +87 -0
  18. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators_step.py +4 -3
  19. loom_kernel-0.7.0/src/loom/etl/declarative/expr/_predicate.py +103 -0
  20. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/_executor.py +7 -0
  21. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_params.py +2 -2
  22. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/config_loader.py +10 -18
  23. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/core.py +6 -8
  24. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_config.py +8 -7
  25. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/auto.py +36 -43
  26. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/runner.py +37 -55
  27. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_bindings.py +42 -99
  28. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_compiler.py +30 -9
  29. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/phases/build_plan.py +39 -58
  30. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/phases/validate.py +4 -5
  31. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/testing.py +14 -10
  32. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/test_async_runtime.py +2 -1
  33. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/test_bootstrap.py +57 -28
  34. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_config.py +1 -1
  35. loom_kernel-0.7.0/tests/unit/core/config/test_binder.py +147 -0
  36. loom_kernel-0.7.0/tests/unit/core/config/test_context.py +115 -0
  37. loom_kernel-0.7.0/tests/unit/core/repository/abc/test_query.py +108 -0
  38. loom_kernel-0.7.0/tests/unit/core/test_compiler_contracts.py +27 -0
  39. loom_kernel-0.7.0/tests/unit/core/test_runner_contracts.py +121 -0
  40. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_config_loader.py +2 -1
  41. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_executor.py +24 -0
  42. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_runner.py +2 -0
  43. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_fastapi_auto_logger.py +19 -8
  44. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/conftest.py +12 -1
  45. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_collect_batch.py +1 -1
  46. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runner.py +70 -20
  47. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_async_walk.py +3 -3
  48. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_basics.py +7 -7
  49. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_config_bindings.py +8 -8
  50. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_multi_source.py +2 -2
  51. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_router.py +4 -4
  52. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_window.py +2 -2
  53. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/test_with.py +3 -3
  54. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/test_compiler_examples.py +1 -1
  55. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/test_flow_examples.py +4 -4
  56. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/test_broadcast.py +3 -3
  57. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_observability_runner.py +1 -1
  58. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_fork.py +2 -2
  59. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/uv.lock +1 -1
  60. loom_kernel-0.6.0/CHANGELOG_RELEASE.md +0 -116
  61. loom_kernel-0.6.0/src/loom/etl/declarative/expr/_predicate.py +0 -174
  62. loom_kernel-0.6.0/tests/unit/core/repository/abc/test_query.py +0 -44
  63. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/ci-main.yml +0 -0
  64. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/ci-pr.yml +0 -0
  65. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/docs.yml +0 -0
  66. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.github/workflows/release.yml +0 -0
  67. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.gitignore +0 -0
  68. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.pre-commit-config.yaml +0 -0
  69. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/.readthedocs.yaml +0 -0
  70. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/LICENSE +0 -0
  71. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/Makefile +0 -0
  72. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/README.md +0 -0
  73. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/codecov.yml +0 -0
  74. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/.gitkeep +0 -0
  75. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/custom.css +0 -0
  76. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/logo-transparent.png +0 -0
  77. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/_static/logo.svg +0 -0
  78. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/adr/README.md +0 -0
  79. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/clean-architecture.md +0 -0
  80. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/architecture/overview.md +0 -0
  81. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/conf.py +0 -0
  82. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/examples.md +0 -0
  83. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/pipelines.md +0 -0
  84. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/etl/testing.md +0 -0
  85. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/examples-repo/index.md +0 -0
  86. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/etl.md +0 -0
  87. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/rest.md +0 -0
  88. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/getting-started/streaming.md +0 -0
  89. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/autocrud.md +0 -0
  90. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/celery.md +0 -0
  91. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/etl.md +0 -0
  92. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/fake-repo-examples.md +0 -0
  93. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/quickstart.md +0 -0
  94. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/guides/use-case-dsl.md +0 -0
  95. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/index.rst +0 -0
  96. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/overview.md +0 -0
  97. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/core.rst +0 -0
  98. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/etl.rst +0 -0
  99. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/repository.rst +0 -0
  100. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/rest.rst +0 -0
  101. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/streaming.rst +0 -0
  102. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/api/testing.rst +0 -0
  103. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/reference/index.rst +0 -0
  104. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/requirements.txt +0 -0
  105. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/autocrud.md +0 -0
  106. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/celery.md +0 -0
  107. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/examples.md +0 -0
  108. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/testing.md +0 -0
  109. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/rest/use-case-dsl.md +0 -0
  110. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/docs/streaming/bytewax.md +0 -0
  111. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/sonar-project.properties +0 -0
  112. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/__init__.py +0 -0
  113. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/__init__.py +0 -0
  114. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/auto.py +0 -0
  115. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/constants.py +0 -0
  116. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/celery/service.py +0 -0
  117. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/__init__.py +0 -0
  118. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/core_model.py +0 -0
  119. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/protocol.py +0 -0
  120. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  121. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/__init__.py +0 -0
  122. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  123. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/bootstrap/kernel.py +0 -0
  124. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/__init__.py +0 -0
  125. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/__init__.py +0 -0
  126. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/backend.py +0 -0
  127. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/abc/dependency.py +0 -0
  128. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/codec.py +0 -0
  129. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/decorators.py +0 -0
  130. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/dependency.py +0 -0
  131. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/gateway.py +0 -0
  132. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/keys.py +0 -0
  133. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/repository.py +0 -0
  134. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/cache/serializer.py +0 -0
  135. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/__init__.py +0 -0
  136. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/adapter.py +0 -0
  137. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/base.py +0 -0
  138. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/field.py +0 -0
  139. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/command/introspection.py +0 -0
  140. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/configurable.py +0 -0
  141. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/errors.py +0 -0
  142. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/loader.py +0 -0
  143. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/model.py +0 -0
  144. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/observability.py +0 -0
  145. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/config/resolver.py +0 -0
  146. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/contracts/__init__.py +0 -0
  147. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/contracts/manifest.py +0 -0
  148. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/__init__.py +0 -0
  149. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/container.py +0 -0
  150. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/di/scope.py +0 -0
  151. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/__init__.py +0 -0
  152. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/_utils.py +0 -0
  153. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/base.py +0 -0
  154. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/interfaces.py +0 -0
  155. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/manifest.py +0 -0
  156. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/discovery/modules.py +0 -0
  157. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/__init__.py +0 -0
  158. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/compilable.py +0 -0
  159. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/compiler.py +0 -0
  160. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/events.py +0 -0
  161. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/executor.py +0 -0
  162. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/metrics.py +0 -0
  163. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/engine/plan.py +0 -0
  164. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/__init__.py +0 -0
  165. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/codes.py +0 -0
  166. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/errors/errors.py +0 -0
  167. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/__init__.py +0 -0
  168. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/eval.py +0 -0
  169. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/nodes.py +0 -0
  170. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/expr/refs.py +0 -0
  171. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/__init__.py +0 -0
  172. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/callback.py +0 -0
  173. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/context.py +0 -0
  174. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/handle.py +0 -0
  175. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/job.py +0 -0
  176. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/job/service.py +0 -0
  177. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/__init__.py +0 -0
  178. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/abc.py +0 -0
  179. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/registry.py +0 -0
  180. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/logger/structlogger.py +0 -0
  181. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/__init__.py +0 -0
  182. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/base.py +0 -0
  183. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/enums.py +0 -0
  184. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/field.py +0 -0
  185. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/introspection.py +0 -0
  186. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/projection.py +0 -0
  187. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/relation.py +0 -0
  188. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/struct.py +0 -0
  189. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/timestamped.py +0 -0
  190. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/types.py +0 -0
  191. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/model/types_postgres.py +0 -0
  192. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/__init__.py +0 -0
  193. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/config.py +0 -0
  194. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/event.py +0 -0
  195. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/__init__.py +0 -0
  196. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/noop.py +0 -0
  197. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/otel.py +0 -0
  198. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/observer/structlog.py +0 -0
  199. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/protocol.py +0 -0
  200. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/runtime.py +0 -0
  201. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/observability/topology.py +0 -0
  202. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/__init__.py +0 -0
  203. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/loaders.py +0 -0
  204. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/projection/runtime.py +0 -0
  205. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/__init__.py +0 -0
  206. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/__init__.py +0 -0
  207. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  208. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/abc/repository.py +0 -0
  209. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/mutation.py +0 -0
  210. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/registration.py +0 -0
  211. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/registry.py +0 -0
  212. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  213. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  214. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  215. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  216. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  217. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  218. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  219. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  220. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  221. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  222. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  223. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  224. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  225. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  226. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  227. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  228. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  229. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/session_manager.py +0 -0
  230. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  231. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  232. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/response/__init__.py +0 -0
  233. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/response/base.py +0 -0
  234. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/__init__.py +0 -0
  235. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/ref.py +0 -0
  236. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/routing/resolver.py +0 -0
  237. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/tracing/__init__.py +0 -0
  238. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/tracing/context.py +0 -0
  239. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/transport/__init__.py +0 -0
  240. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/transport/adapter.py +0 -0
  241. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/__init__.py +0 -0
  242. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/abc.py +0 -0
  243. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/uow/context.py +0 -0
  244. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/__init__.py +0 -0
  245. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/_predicates.py +0 -0
  246. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/compute.py +0 -0
  247. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/constants.py +0 -0
  248. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/factory.py +0 -0
  249. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/field_ref.py +0 -0
  250. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/invoker.py +0 -0
  251. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/keys.py +0 -0
  252. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/markers.py +0 -0
  253. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/registry.py +0 -0
  254. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/rule.py +0 -0
  255. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/core/use_case/use_case.py +0 -0
  256. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/__init__.py +0 -0
  257. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/__init__.py +0 -0
  258. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_format_registry.py +0 -0
  259. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  260. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  261. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  262. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  263. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  264. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  265. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_merge.py +0 -0
  266. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_predicate.py +0 -0
  267. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  268. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  269. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  270. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/_write_policy.py +0 -0
  271. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  272. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  273. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  274. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  275. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  276. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  277. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  278. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  279. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  280. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/polars/provider.py +0 -0
  281. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  282. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  283. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  284. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  285. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  286. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  287. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/_writer.py +0 -0
  288. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/backends/spark/provider.py +0 -0
  289. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  290. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  291. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  292. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  293. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  294. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  295. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/checkpoint/_store.py +0 -0
  296. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/__init__.py +0 -0
  297. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_binding.py +0 -0
  298. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_compiler.py +0 -0
  299. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_errors.py +0 -0
  300. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_plan.py +0 -0
  301. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators.py +0 -0
  302. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  303. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/__init__.py +0 -0
  304. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_format.py +0 -0
  305. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_read_options.py +0 -0
  306. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_utils.py +0 -0
  307. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/_write_options.py +0 -0
  308. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  309. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  310. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  311. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  312. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  313. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/_from.py +0 -0
  314. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  315. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  316. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_file.py +0 -0
  317. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  318. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  319. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  320. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  321. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  322. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  323. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_into.py +0 -0
  324. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_schema_mode.py +0 -0
  325. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_table.py +0 -0
  326. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  327. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/__init__.py +0 -0
  328. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  329. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/__init__.py +0 -0
  330. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_config.py +0 -0
  331. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_observer.py +0 -0
  332. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/_records.py +0 -0
  333. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  334. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  335. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  336. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  337. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/__init__.py +0 -0
  338. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_generics.py +0 -0
  339. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  340. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_process.py +0 -0
  341. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_sql.py +0 -0
  342. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_step.py +0 -0
  343. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  344. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/__init__.py +0 -0
  345. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/_providers.py +0 -0
  346. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/_wiring.py +0 -0
  347. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/errors.py +0 -0
  348. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runner/filtering.py +0 -0
  349. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runtime/__init__.py +0 -0
  350. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/runtime/contracts.py +0 -0
  351. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/__init__.py +0 -0
  352. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/_contract.py +0 -0
  353. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/schema/_schema.py +0 -0
  354. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/__init__.py +0 -0
  355. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_file_locator.py +0 -0
  356. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/_locator.py +0 -0
  357. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/storage/routing.py +0 -0
  358. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/__init__.py +0 -0
  359. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_result.py +0 -0
  360. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_runners.py +0 -0
  361. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_scenario.py +0 -0
  362. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/_stubs.py +0 -0
  363. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/etl/testing/spark.py +0 -0
  364. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/__init__.py +0 -0
  365. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/adapter.py +0 -0
  366. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/kafka.py +0 -0
  367. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/lifecycle.py +0 -0
  368. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/prometheus/middleware.py +0 -0
  369. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/__init__.py +0 -0
  370. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/adapter.py +0 -0
  371. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/autocrud.py +0 -0
  372. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/compiler.py +0 -0
  373. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/constants.py +0 -0
  374. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/errors.py +0 -0
  375. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/__init__.py +0 -0
  376. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/app.py +0 -0
  377. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/openapi.py +0 -0
  378. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/response.py +0 -0
  379. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  380. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/middleware.py +0 -0
  381. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/model.py +0 -0
  382. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/rest/rest_adapter.py +0 -0
  383. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/__init__.py +0 -0
  384. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  385. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_adapter.py +0 -0
  386. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  387. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  388. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  389. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  390. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_resource_manager.py +0 -0
  391. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  392. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  393. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/_shared.py +0 -0
  394. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  395. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +0 -0
  396. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/routing.py +0 -0
  397. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  398. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  399. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/bytewax/handlers/steps.py +0 -0
  400. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/__init__.py +0 -0
  401. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/compiler/_plan.py +0 -0
  402. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/__init__.py +0 -0
  403. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_errors.py +0 -0
  404. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_exceptions.py +0 -0
  405. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_message.py +0 -0
  406. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/core/_typing.py +0 -0
  407. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/graph/__init__.py +0 -0
  408. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/graph/_flow.py +0 -0
  409. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/__init__.py +0 -0
  410. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_codec.py +0 -0
  411. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_config.py +0 -0
  412. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_errors.py +0 -0
  413. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  414. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_message.py +0 -0
  415. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_record.py +0 -0
  416. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/_wire.py +0 -0
  417. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  418. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  419. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  420. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  421. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  422. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  423. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  424. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  425. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/__init__.py +0 -0
  426. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  427. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  428. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  429. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  430. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_fork.py +0 -0
  431. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  432. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  433. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_router.py +0 -0
  434. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_shape.py +0 -0
  435. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_step.py +0 -0
  436. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/_with.py +0 -0
  437. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/streaming/nodes/refs.py +0 -0
  438. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/__init__.py +0 -0
  439. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/golden.py +0 -0
  440. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/http_harness.py +0 -0
  441. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/in_memory.py +0 -0
  442. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/repository_harness.py +0 -0
  443. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/src/loom/testing/runner.py +0 -0
  444. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/__init__.py +0 -0
  445. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/conftest.py +0 -0
  446. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/__init__.py +0 -0
  447. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/baselines/.gitkeep +0 -0
  448. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/outputs/.gitkeep +0 -0
  449. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/golden/plans/.gitkeep +0 -0
  450. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/helpers/__init__.py +0 -0
  451. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/__init__.py +0 -0
  452. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
  453. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  454. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  455. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
  456. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/conftest.py +0 -0
  457. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/__init__.py +0 -0
  458. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/bootstrap/__init__.py +0 -0
  459. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
  460. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/__init__.py +0 -0
  461. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
  462. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  463. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  464. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  465. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/__init__.py +0 -0
  466. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  467. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  468. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
  469. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
  470. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/__init__.py +0 -0
  471. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  472. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  473. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/etl/__init__.py +0 -0
  474. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/etl/test_runner_integration.py +0 -0
  475. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/__init__.py +0 -0
  476. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/__init__.py +0 -0
  477. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
  478. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  479. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  480. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
  481. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/main.py +0 -0
  482. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/manifest.py +0 -0
  483. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/__init__.py +0 -0
  484. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
  485. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/model.py +0 -0
  486. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  487. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/interface.py +0 -0
  488. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/jobs.py +0 -0
  489. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/model.py +0 -0
  490. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/relations.py +0 -0
  491. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/repository.py +0 -0
  492. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  493. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
  494. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/model.py +0 -0
  495. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  496. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/schemas.py +0 -0
  497. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
  498. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/support/__init__.py +0 -0
  499. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
  500. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/__init__.py +0 -0
  501. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_bootstrap/__init__.py +0 -0
  502. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/__init__.py +0 -0
  503. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_auto.py +0 -0
  504. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
  505. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/celery_jobs/test_runner.py +0 -0
  506. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/__init__.py +0 -0
  507. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/backend/__init__.py +0 -0
  508. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  509. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/__init__.py +0 -0
  510. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  511. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  512. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  513. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/cache/__init__.py +0 -0
  514. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
  515. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/__init__.py +0 -0
  516. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_base.py +0 -0
  517. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_field.py +0 -0
  518. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_command_patch.py +0 -0
  519. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/command/test_introspection.py +0 -0
  520. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/__init__.py +0 -0
  521. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/test_config.py +0 -0
  522. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/config/test_configurable.py +0 -0
  523. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/di/__init__.py +0 -0
  524. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/di/test_container.py +0 -0
  525. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/discovery/__init__.py +0 -0
  526. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/discovery/test_manifest.py +0 -0
  527. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/__init__.py +0 -0
  528. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_compiler.py +0 -0
  529. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor.py +0 -0
  530. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
  531. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
  532. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_metrics.py +0 -0
  533. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/engine/test_plan.py +0 -0
  534. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/errors/__init__.py +0 -0
  535. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/errors/test_errors.py +0 -0
  536. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/expr/__init__.py +0 -0
  537. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/expr/test_expr.py +0 -0
  538. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/__init__.py +0 -0
  539. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/conftest.py +0 -0
  540. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_callback.py +0 -0
  541. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_context.py +0 -0
  542. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_handle.py +0 -0
  543. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_inline_service.py +0 -0
  544. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/job/test_job.py +0 -0
  545. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/__init__.py +0 -0
  546. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/test_config.py +0 -0
  547. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/logger/test_registry.py +0 -0
  548. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/__init__.py +0 -0
  549. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_model.py +0 -0
  550. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_struct.py +0 -0
  551. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/model/test_timestamped.py +0 -0
  552. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/__init__.py +0 -0
  553. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/test_observers.py +0 -0
  554. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/observability/test_runtime.py +0 -0
  555. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/projection/__init__.py +0 -0
  556. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/projection/test_runtime.py +0 -0
  557. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/__init__.py +0 -0
  558. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/__init__.py +0 -0
  559. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/conftest.py +0 -0
  560. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  561. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/__init__.py +0 -0
  562. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  563. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
  564. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  565. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  566. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/routing/__init__.py +0 -0
  567. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/routing/test_routing.py +0 -0
  568. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/test_async_bridge.py +0 -0
  569. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/tracing/__init__.py +0 -0
  570. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/tracing/test_context.py +0 -0
  571. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/__init__.py +0 -0
  572. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
  573. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  574. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  575. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/__init__.py +0 -0
  576. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_compute.py +0 -0
  577. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_factory.py +0 -0
  578. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
  579. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_invoker.py +0 -0
  580. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_markers.py +0 -0
  581. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_rule.py +0 -0
  582. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/core/use_case/test_use_case.py +0 -0
  583. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/__init__.py +0 -0
  584. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/__init__.py +0 -0
  585. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
  586. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
  587. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/__init__.py +0 -0
  588. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  589. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  590. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  591. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  592. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  593. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  594. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  595. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  596. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  597. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
  598. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  599. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
  600. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/__init__.py +0 -0
  601. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  602. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  603. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  604. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  605. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
  606. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
  607. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  608. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/__init__.py +0 -0
  609. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/backends/__init__.py +0 -0
  610. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  611. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  612. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  613. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
  614. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/__init__.py +0 -0
  615. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  616. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
  617. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  618. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  619. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors.py +0 -0
  620. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  621. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  622. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  623. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  624. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  625. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  626. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_structural.py +0 -0
  627. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  628. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  629. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/conftest.py +0 -0
  630. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/__init__.py +0 -0
  631. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_history_target.py +0 -0
  632. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source.py +0 -0
  633. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source_json.py +0 -0
  634. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_source_options.py +0 -0
  635. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_target.py +0 -0
  636. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_utils.py +0 -0
  637. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/io/test_variants.py +0 -0
  638. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_observer.py +0 -0
  639. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_records.py +0 -0
  640. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/lineage/test_store.py +0 -0
  641. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/__init__.py +0 -0
  642. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  643. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  644. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/pipeline/test_step.py +0 -0
  645. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/__init__.py +0 -0
  646. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_contract.py +0 -0
  647. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_schema.py +0 -0
  648. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/schema/test_table.py +0 -0
  649. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/__init__.py +0 -0
  650. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_merge.py +0 -0
  651. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_predicate.py +0 -0
  652. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  653. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  654. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/__init__.py +0 -0
  655. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
  656. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  657. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_locator.py +0 -0
  658. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
  659. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_route_build.py +0 -0
  660. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  661. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
  662. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_format_registry.py +0 -0
  663. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_module_contracts.py +0 -0
  664. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
  665. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
  666. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_runner_errors.py +0 -0
  667. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/test_spark_testing.py +0 -0
  668. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/__init__.py +0 -0
  669. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_runners.py +0 -0
  670. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
  671. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  672. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/__init__.py +0 -0
  673. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/test_adapter.py +0 -0
  674. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/prometheus/test_middleware.py +0 -0
  675. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/__init__.py +0 -0
  676. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_autocrud.py +0 -0
  677. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_middleware.py +0 -0
  678. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  679. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_response.py +0 -0
  680. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_adapter.py +0 -0
  681. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_compiler.py +0 -0
  682. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_rest_model.py +0 -0
  683. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/rest/test_router_runtime.py +0 -0
  684. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/__init__.py +0 -0
  685. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/__init__.py +0 -0
  686. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/cases.py +0 -0
  687. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_adapter.py +0 -0
  688. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
  689. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
  690. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
  691. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
  692. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
  693. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
  694. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
  695. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
  696. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/bytewax/test_steps.py +0 -0
  697. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/__init__.py +0 -0
  698. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/compiler/cases.py +0 -0
  699. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/conftest.py +0 -0
  700. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/__init__.py +0 -0
  701. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/cases.py +0 -0
  702. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
  703. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_message.py +0 -0
  704. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
  705. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
  706. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/__init__.py +0 -0
  707. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/__init__.py +0 -0
  708. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
  709. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
  710. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/router.py +0 -0
  711. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
  712. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
  713. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/flows/conftest.py +0 -0
  714. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/__init__.py +0 -0
  715. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/cases.py +0 -0
  716. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/conftest.py +0 -0
  717. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/fakes.py +0 -0
  718. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_client.py +0 -0
  719. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_config.py +0 -0
  720. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
  721. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_message.py +0 -0
  722. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
  723. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
  724. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
  725. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
  726. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
  727. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/__init__.py +0 -0
  728. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/conftest.py +0 -0
  729. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
  730. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/__init__.py +0 -0
  731. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/cases.py +0 -0
  732. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/conftest.py +0 -0
  733. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
  734. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_registry.py +0 -0
  735. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
  736. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/support/__init__.py +0 -0
  737. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/support/flow_cases.py +0 -0
  738. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_otel_observability.py +0 -0
  739. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_routing.py +0 -0
  740. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/streaming/test_with.py +0 -0
  741. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/__init__.py +0 -0
  742. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_golden.py +0 -0
  743. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_http_harness.py +0 -0
  744. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_in_memory.py +0 -0
  745. {loom_kernel-0.6.0 → loom_kernel-0.7.0}/tests/unit/testing/test_runner.py +0 -0
@@ -1,3 +1,101 @@
1
+ # 🚀 Release 0.7.0 ([#25](https://github.com/the-reacher-data/loom-py/pull/25)) ([`0d8941a`](https://github.com/the-reacher-data/loom-py/commit/0d8941a724ec768b162a07e756bac3d53157ec85))
2
+
3
+
4
+ ## ✨ Features
5
+ ### config
6
+ - **config:** add StructBinder and migrate streaming binding resolution<br>
7
+ > Introduces StructBinder in core/config/binder.py — a Strategy that
8
+ > injects constructor arguments from a config mapping via msgspec.convert,
9
+ > covering primitives, Literal constraints, and LoomFrozenStruct subclasses.
10
+ > Migrates streaming _instantiate_binding to use it, removing ~30 lines of
11
+ > private helpers and adding typed ConfigError on resolution failures.
12
+
13
+ - **config:** add ConfigContext for typed section extraction and binding resolution<br>
14
+ > Single entry-point for runner and bootstrap code to read config:
15
+ > section() extracts typed sub-trees, bind() injects constructor args
16
+ > from a config path + overrides, resolve() materializes ConfigBinding
17
+ > declarations. Accepts an optional StructBinder for strict-mode control.
18
+
19
+
20
+
21
+ ## 🐛 Fixes
22
+ ### core
23
+ - **core:** clean async bridge timeout and celery typing
24
+
25
+ ### etl
26
+ - **etl:** align missing storage error with config contract
27
+
28
+
29
+
30
+
31
+ ## ♻️ Refactor
32
+ ### model
33
+ - **model:** migrate public config structs to LoomFrozenStruct
34
+
35
+ ### streaming
36
+ - **streaming:** clean up _instantiate_binding before extraction<br>
37
+ > Replace mutable dict() + .update() with a single dict unpacking
38
+ > Remove the dead param.annotation fallback (get_type_hints already
39
+ > resolves all forward refs; the fallback silently passed strings to
40
+ > _is_struct_annotation which always returned False)
41
+ > Extract _SKIP_KINDS constant to name the variadic-parameter guard
42
+ > Raise ConfigError instead of TypeError for missing required struct
43
+ > params (semantically a config error, not a type error; both are
44
+ > caught by the enclosing _resolve_binding handler so no behaviour
45
+ > change in streaming)
46
+ > All 7 binding tests pass.
47
+
48
+
49
+ ### core
50
+ - **core:** homogenize config and runner boundaries
51
+ - **core:** add runner and compiler protocols
52
+ - **core:** apply runner lifecycle protocols
53
+ - **core:** harden runner lifecycle abstraction<br>
54
+ > shutdown_runner/flush_runner now catch and log exceptions instead of
55
+ > propagating, preserving the original exception when called from finally
56
+ > blocks; contract updated in docstrings and covered by new tests
57
+ > CompilerProtocol drops @runtime_checkable — no production isinstance
58
+ > usage existed; Protocol remains valid for static typing
59
+ > StreamingRunner.prepare_run() calls shutdown_runner(self) before
60
+ > overwriting self._shutdown, preventing resource leaks on double calls
61
+ > _build_backend_options extracted from loom.celery.config into
62
+ > loom.core.async_bridge.build_backend_options, eliminating duplication
63
+ > between the Celery and streaming domains
64
+ > _CeleryAsyncRuntime._signals_connected ClassVar removed; the
65
+ > module-level _SIGNALS_CONNECTED flag is the single source of truth
66
+ > for the process-level signal guard
67
+ > ETLRunner.flush() delegates to ETLExecutor.flush(), which checks
68
+ > SupportsFlush via isinstance instead of getattr duck-typing
69
+ > TypeVars in compiler.py renamed to _RequestT/_PlanT to signal they
70
+ > are implementation details of the Protocol, not public API
71
+
72
+
73
+ ### etl
74
+ - **etl:** make flush an optional runner capability
75
+
76
+ ### celery
77
+ - **celery:** adopt runner shutdown helper
78
+ - **celery:** replace _SIGNALS_CONNECTED sentinel with dispatch_uid<br>
79
+ > Eliminates the module-level mutable boolean that violated the no-global-
80
+ > mutable-state architecture rule. Idempotency is now handled by Celery's
81
+ > dispatch_uid mechanism: disconnect+connect on each call ensures the most-
82
+ > recently registered closure is always active, so a second bootstrap_worker
83
+ > call wires up fresh dependencies rather than leaving stale closures from
84
+ > the first call.
85
+ > This is strictly better than the sentinel: no global state, no race
86
+ > condition between threads calling bootstrap_worker concurrently, and
87
+ > correct closure replacement when called multiple times in tests.
88
+
89
+
90
+ ### rest
91
+ - **rest:** use observability config directly
92
+
93
+
94
+
95
+
96
+
97
+
98
+
1
99
  # 🚀 Release 0.6.0 ([#22](https://github.com/the-reacher-data/loom-py/pull/22)) ([`5146569`](https://github.com/the-reacher-data/loom-py/commit/51465697115036ed05f620a1099272e4fd216501))
2
100
 
3
101
 
@@ -0,0 +1,96 @@
1
+ # 🚀 Release 0.7.0 ([#25](https://github.com/the-reacher-data/loom-py/pull/25)) ([`0d8941a`](https://github.com/the-reacher-data/loom-py/commit/0d8941a724ec768b162a07e756bac3d53157ec85))
2
+
3
+
4
+ ## ✨ Features
5
+ ### config
6
+ - **config:** add StructBinder and migrate streaming binding resolution<br>
7
+ > Introduces StructBinder in core/config/binder.py — a Strategy that
8
+ > injects constructor arguments from a config mapping via msgspec.convert,
9
+ > covering primitives, Literal constraints, and LoomFrozenStruct subclasses.
10
+ > Migrates streaming _instantiate_binding to use it, removing ~30 lines of
11
+ > private helpers and adding typed ConfigError on resolution failures.
12
+
13
+ - **config:** add ConfigContext for typed section extraction and binding resolution<br>
14
+ > Single entry-point for runner and bootstrap code to read config:
15
+ > section() extracts typed sub-trees, bind() injects constructor args
16
+ > from a config path + overrides, resolve() materializes ConfigBinding
17
+ > declarations. Accepts an optional StructBinder for strict-mode control.
18
+
19
+
20
+
21
+ ## 🐛 Fixes
22
+ ### core
23
+ - **core:** clean async bridge timeout and celery typing
24
+
25
+ ### etl
26
+ - **etl:** align missing storage error with config contract
27
+
28
+
29
+
30
+
31
+ ## ♻️ Refactor
32
+ ### model
33
+ - **model:** migrate public config structs to LoomFrozenStruct
34
+
35
+ ### streaming
36
+ - **streaming:** clean up _instantiate_binding before extraction<br>
37
+ > Replace mutable dict() + .update() with a single dict unpacking
38
+ > Remove the dead param.annotation fallback (get_type_hints already
39
+ > resolves all forward refs; the fallback silently passed strings to
40
+ > _is_struct_annotation which always returned False)
41
+ > Extract _SKIP_KINDS constant to name the variadic-parameter guard
42
+ > Raise ConfigError instead of TypeError for missing required struct
43
+ > params (semantically a config error, not a type error; both are
44
+ > caught by the enclosing _resolve_binding handler so no behaviour
45
+ > change in streaming)
46
+ > All 7 binding tests pass.
47
+
48
+
49
+ ### core
50
+ - **core:** homogenize config and runner boundaries
51
+ - **core:** add runner and compiler protocols
52
+ - **core:** apply runner lifecycle protocols
53
+ - **core:** harden runner lifecycle abstraction<br>
54
+ > shutdown_runner/flush_runner now catch and log exceptions instead of
55
+ > propagating, preserving the original exception when called from finally
56
+ > blocks; contract updated in docstrings and covered by new tests
57
+ > CompilerProtocol drops @runtime_checkable — no production isinstance
58
+ > usage existed; Protocol remains valid for static typing
59
+ > StreamingRunner.prepare_run() calls shutdown_runner(self) before
60
+ > overwriting self._shutdown, preventing resource leaks on double calls
61
+ > _build_backend_options extracted from loom.celery.config into
62
+ > loom.core.async_bridge.build_backend_options, eliminating duplication
63
+ > between the Celery and streaming domains
64
+ > _CeleryAsyncRuntime._signals_connected ClassVar removed; the
65
+ > module-level _SIGNALS_CONNECTED flag is the single source of truth
66
+ > for the process-level signal guard
67
+ > ETLRunner.flush() delegates to ETLExecutor.flush(), which checks
68
+ > SupportsFlush via isinstance instead of getattr duck-typing
69
+ > TypeVars in compiler.py renamed to _RequestT/_PlanT to signal they
70
+ > are implementation details of the Protocol, not public API
71
+
72
+
73
+ ### etl
74
+ - **etl:** make flush an optional runner capability
75
+
76
+ ### celery
77
+ - **celery:** adopt runner shutdown helper
78
+ - **celery:** replace _SIGNALS_CONNECTED sentinel with dispatch_uid<br>
79
+ > Eliminates the module-level mutable boolean that violated the no-global-
80
+ > mutable-state architecture rule. Idempotency is now handled by Celery's
81
+ > dispatch_uid mechanism: disconnect+connect on each call ensures the most-
82
+ > recently registered closure is always active, so a second bootstrap_worker
83
+ > call wires up fresh dependencies rather than leaving stale closures from
84
+ > the first call.
85
+ > This is strictly better than the sentinel: no global state, no race
86
+ > condition between threads calling bootstrap_worker concurrently, and
87
+ > correct closure replacement when called multiple times in tests.
88
+
89
+
90
+ ### rest
91
+ - **rest:** use observability config directly
92
+
93
+
94
+
95
+
96
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loom-kernel
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: Loom Python project
5
5
  License-File: LICENSE
6
6
  Requires-Python: >=3.11
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "loom-kernel"
3
- version = "0.6.0"
3
+ version = "0.7.0"
4
4
  description = "Loom Python project"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -220,7 +220,7 @@ markers = [
220
220
 
221
221
  [tool.commitizen]
222
222
  name = "cz_conventional_commits"
223
- version = "0.6.0"
223
+ version = "0.7.0"
224
224
  tag_format = "v$version"
225
225
  version_files = [
226
226
  "pyproject.toml:project.version",
@@ -6,7 +6,7 @@ registration:
6
6
 
7
7
  1. Load and merge YAML configuration.
8
8
  2. Create :class:`~loom.core.di.container.LoomContainer` and register the
9
- raw config as an ``APPLICATION``-scope singleton.
9
+ resolved app config as an ``APPLICATION``-scope singleton.
10
10
  3. Execute user-supplied module callables.
11
11
  4. Compile all declared ``Job`` subclasses via
12
12
  :class:`~loom.core.engine.compiler.UseCaseCompiler`.
@@ -54,9 +54,9 @@ from __future__ import annotations
54
54
 
55
55
  import importlib
56
56
  import inspect
57
- from collections.abc import Callable, Sequence
57
+ from collections.abc import Callable, Mapping, Sequence
58
58
  from dataclasses import dataclass, field
59
- from typing import TYPE_CHECKING, Any, Literal, TypeVar
59
+ from typing import Any, Literal, Protocol, TypeVar
60
60
 
61
61
  import msgspec
62
62
  from celery import Celery # type: ignore[import-untyped]
@@ -69,7 +69,6 @@ from loom.celery.config import (
69
69
  CeleryConfig,
70
70
  CeleryRuntimeConfig,
71
71
  JobConfig,
72
- _build_backend_options,
73
72
  apply_job_config,
74
73
  create_celery_app,
75
74
  )
@@ -80,14 +79,15 @@ from loom.celery.runner import (
80
79
  _make_callback_task,
81
80
  _make_job_task,
82
81
  )
82
+ from loom.core.async_bridge import build_backend_options
83
83
  from loom.core.backend.sqlalchemy import compile_all, reset_registry
84
84
  from loom.core.bootstrap import create_kernel
85
+ from loom.core.config import ConfigContext, ConfigKey
85
86
  from loom.core.config.errors import ConfigError
86
- from loom.core.config.keys import ConfigKey
87
- from loom.core.config.loader import load_config, section
88
87
  from loom.core.di.container import LoomContainer
89
88
  from loom.core.discovery._utils import collect_from_modules, import_modules
90
89
  from loom.core.engine.compilable import Compilable
90
+ from loom.core.engine.metrics import MetricsAdapter
91
91
  from loom.core.job.job import Job
92
92
  from loom.core.model import BaseModel
93
93
  from loom.core.observability.config import ObservabilityConfig
@@ -95,15 +95,11 @@ from loom.core.observability.runtime import ObservabilityRuntime
95
95
  from loom.core.repository.sqlalchemy import build_sqlalchemy_repository_registration_module
96
96
  from loom.core.repository.sqlalchemy.session_manager import SessionManager
97
97
  from loom.core.repository.sqlalchemy.uow import SQLAlchemyUnitOfWorkFactory
98
+ from loom.core.runner import shutdown_runner
98
99
  from loom.core.uow.abc import UnitOfWorkFactory
99
100
  from loom.core.use_case.factory import UseCaseFactory
100
101
  from loom.rest.autocrud import build_auto_routes
101
102
 
102
- if TYPE_CHECKING:
103
- from omegaconf import DictConfig
104
-
105
- from loom.core.engine.metrics import MetricsAdapter
106
-
107
103
  _T = TypeVar("_T")
108
104
 
109
105
 
@@ -203,22 +199,30 @@ class _WorkerResolved:
203
199
  # Celery worker lifecycle signals
204
200
  # ---------------------------------------------------------------------------
205
201
 
202
+ _WORKER_INIT_UID = "loom.celery.worker.init"
203
+ _WORKER_SHUTDOWN_UID = "loom.celery.worker.shutdown"
204
+
205
+
206
+ class _AsyncRuntimeProtocol(Protocol):
207
+ def initialize(self) -> None: ...
208
+
209
+ def run(self, coro: Any, *, eager_fallback: bool) -> Any: ...
206
210
 
207
- _SIGNALS_CONNECTED = False
211
+ def shutdown(self) -> None: ...
208
212
 
209
213
 
210
214
  def _build_async_runtime(runtime_cfg: CeleryRuntimeConfig) -> _CeleryAsyncRuntime:
211
215
  """Build the per-process async runtime used by Celery worker tasks."""
212
216
  return _CeleryAsyncRuntime(
213
217
  backend=runtime_cfg.backend,
214
- backend_options=_build_backend_options(runtime_cfg.backend, runtime_cfg.use_uvloop),
218
+ backend_options=build_backend_options(runtime_cfg.backend, runtime_cfg.use_uvloop),
215
219
  shutdown_timeout_ms=runtime_cfg.shutdown_timeout_ms,
216
220
  )
217
221
 
218
222
 
219
223
  def _connect_worker_signals(
220
224
  session_manager: SessionManager | None,
221
- async_runtime: _CeleryAsyncRuntime,
225
+ async_runtime: _AsyncRuntimeProtocol,
222
226
  ) -> None:
223
227
  """Connect Celery worker lifecycle signals for per-process bridge management.
224
228
 
@@ -229,9 +233,12 @@ def _connect_worker_signals(
229
233
  * ``worker_process_shutdown`` — disposes the session manager through
230
234
  the bridge, then shuts it down.
231
235
 
232
- Idempotent: subsequent calls within the same process are no-ops.
233
- This prevents handler accumulation when :func:`bootstrap_worker` is
234
- called more than once (e.g. in integration tests without full isolation).
236
+ Idempotency is guaranteed by ``dispatch_uid``: subsequent calls replace
237
+ the active closures rather than accumulating handlers. This means that
238
+ when :func:`bootstrap_worker` is called more than once (e.g. in
239
+ integration tests), the most-recently registered ``session_manager`` and
240
+ ``async_runtime`` are always the ones used at shutdown — no stale
241
+ closures remain active.
235
242
 
236
243
  Args:
237
244
  session_manager: The shared :class:`~SessionManager` instance
@@ -239,9 +246,6 @@ def _connect_worker_signals(
239
246
  on shutdown when present.
240
247
  async_runtime: Per-process async bridge runtime used for async jobs.
241
248
  """
242
- global _SIGNALS_CONNECTED
243
- if _SIGNALS_CONNECTED:
244
- return
245
249
 
246
250
  def _on_init(**kwargs: Any) -> None:
247
251
  async_runtime.initialize()
@@ -259,21 +263,24 @@ def _connect_worker_signals(
259
263
  close()
260
264
  raise
261
265
  finally:
262
- async_runtime.shutdown()
266
+ shutdown_runner(async_runtime)
263
267
 
264
- worker_process_init.connect(_on_init, weak=False)
265
- worker_process_shutdown.connect(_on_shutdown, weak=False)
266
- _CeleryAsyncRuntime._signals_connected = True
267
- _SIGNALS_CONNECTED = True
268
+ worker_process_init.disconnect(dispatch_uid=_WORKER_INIT_UID)
269
+ worker_process_init.connect(_on_init, weak=False, dispatch_uid=_WORKER_INIT_UID)
270
+ worker_process_shutdown.disconnect(dispatch_uid=_WORKER_SHUTDOWN_UID)
271
+ worker_process_shutdown.connect(_on_shutdown, weak=False, dispatch_uid=_WORKER_SHUTDOWN_UID)
268
272
 
269
273
 
270
- def _resolve_uow_factory(raw: DictConfig) -> tuple[UnitOfWorkFactory | None, SessionManager | None]:
274
+ def _resolve_uow_factory(
275
+ ctx: ConfigContext | Mapping[str, Any],
276
+ ) -> tuple[UnitOfWorkFactory | None, SessionManager | None]:
271
277
  """Return SQLAlchemy UoW factory when database config is present.
272
278
 
273
279
  This keeps worker bootstrap lightweight for pure jobs that do not use DB.
274
280
  """
281
+ config = _ensure_config_context(ctx)
275
282
  try:
276
- db_cfg = section(raw, ConfigKey.DATABASE, _WorkerDbConfig)
283
+ db_cfg = config.section(ConfigKey.DATABASE, _WorkerDbConfig)
277
284
  except ConfigError:
278
285
  return None, None
279
286
 
@@ -291,19 +298,22 @@ def _resolve_uow_factory(raw: DictConfig) -> tuple[UnitOfWorkFactory | None, Ses
291
298
  # ---------------------------------------------------------------------------
292
299
 
293
300
 
294
- def _apply_job_config_if_present(raw: DictConfig, job_type: type[Job[Any]]) -> None:
301
+ def _apply_job_config_if_present(
302
+ ctx: ConfigContext | Mapping[str, Any],
303
+ job_type: type[Job[Any]],
304
+ ) -> None:
295
305
  """Apply ``JobConfig`` overrides from YAML to ``job_type``'s ClassVars.
296
306
 
297
307
  Silently skips when the ``jobs.<JobTypeName>`` section is absent — the
298
308
  Job's ClassVar defaults remain unchanged.
299
309
 
300
310
  Args:
301
- raw: Root :class:`omegaconf.DictConfig` returned by
302
- :func:`~loom.core.config.loader.load_config`.
311
+ ctx: Resolved configuration context.
303
312
  job_type: Concrete ``Job`` subclass to configure.
304
313
  """
314
+ config = _ensure_config_context(ctx)
305
315
  try:
306
- cfg = section(raw, f"{ConfigKey.JOBS}.{job_type.__name__}", JobConfig)
316
+ cfg = config.section(f"{ConfigKey.JOBS}.{job_type.__name__}", JobConfig)
307
317
  apply_job_config(job_type, cfg)
308
318
  except ConfigError:
309
319
  pass # no override for this job — use ClassVar defaults
@@ -524,25 +534,27 @@ def _discover_compilables_from_config(
524
534
  return _discover_from_manifest(discovery_cfg)
525
535
 
526
536
 
527
- def _try_discover_components(raw: DictConfig) -> _WorkerResolved:
537
+ def _try_discover_components(ctx: ConfigContext | Mapping[str, Any]) -> _WorkerResolved:
528
538
  """Best-effort discovery; returns empty _WorkerResolved if config is absent."""
539
+ config = _ensure_config_context(ctx)
529
540
  try:
530
- app_cfg = section(raw, ConfigKey.APP, _WorkerAppConfig)
541
+ app_cfg = config.section(ConfigKey.APP, _WorkerAppConfig)
531
542
  return _discover_compilables_from_config(app_cfg.discovery)
532
543
  except (ConfigError, RuntimeError, ValueError, TypeError):
533
544
  return _WorkerResolved(compilables=(), jobs=(), models=(), callbacks=())
534
545
 
535
546
 
536
547
  def _resolve_compilables_and_jobs(
537
- raw: DictConfig,
548
+ ctx: ConfigContext | Mapping[str, Any],
538
549
  explicit_jobs: Sequence[type[Job[Any]]],
539
550
  explicit_use_cases: Sequence[type[Compilable]],
540
551
  ) -> _WorkerResolved:
541
552
  """Resolve worker components from explicit args and/or discovery config."""
553
+ config = _ensure_config_context(ctx)
542
554
  if explicit_jobs or explicit_use_cases:
543
555
  jobs = tuple(explicit_jobs)
544
556
  compilables = _merge_unique(explicit_use_cases, jobs)
545
- discovered = _try_discover_components(raw)
557
+ discovered = _try_discover_components(config)
546
558
  extra = tuple(c for c in discovered.compilables if c not in set(compilables))
547
559
  return _WorkerResolved(
548
560
  compilables=(*compilables, *extra),
@@ -552,7 +564,7 @@ def _resolve_compilables_and_jobs(
552
564
  )
553
565
 
554
566
  try:
555
- app_cfg = section(raw, ConfigKey.APP, _WorkerAppConfig)
567
+ app_cfg = config.section(ConfigKey.APP, _WorkerAppConfig)
556
568
  except ConfigError as exc:
557
569
  raise RuntimeError(
558
570
  "No jobs provided and no app.discovery configured for worker bootstrap."
@@ -594,10 +606,13 @@ def _compile_models(models: Sequence[type[BaseModel]]) -> tuple[type[BaseModel],
594
606
  # ---------------------------------------------------------------------------
595
607
 
596
608
 
597
- def _build_observability_runtime(raw: DictConfig) -> ObservabilityRuntime:
609
+ def _build_observability_runtime(
610
+ ctx: ConfigContext | Mapping[str, Any],
611
+ ) -> ObservabilityRuntime:
598
612
  """Build the shared observability runtime from top-level config."""
613
+ config = _ensure_config_context(ctx)
599
614
  try:
600
- observability_cfg = section(raw, ConfigKey.OBSERVABILITY, ObservabilityConfig)
615
+ observability_cfg = config.section(ConfigKey.OBSERVABILITY, ObservabilityConfig)
601
616
  except ConfigError:
602
617
  observability_cfg = ObservabilityConfig()
603
618
  return ObservabilityRuntime.from_config(observability_cfg)
@@ -642,6 +657,13 @@ def _emit_worker_init_graph(components: _WorkerResolved) -> None:
642
657
  )
643
658
 
644
659
 
660
+ def _ensure_config_context(source: ConfigContext | Mapping[str, Any]) -> ConfigContext:
661
+ """Return a :class:`ConfigContext` for any supported config input."""
662
+ if isinstance(source, ConfigContext):
663
+ return source
664
+ return ConfigContext.from_dict(source)
665
+
666
+
645
667
  # ---------------------------------------------------------------------------
646
668
  # Result
647
669
  # ---------------------------------------------------------------------------
@@ -750,21 +772,22 @@ def bootstrap_worker(
750
772
  )
751
773
  result.celery_app.start()
752
774
  """
753
- raw = load_config(*config_paths)
754
- celery_cfg = section(raw, ConfigKey.CELERY, CeleryConfig)
755
- observability_runtime = _build_observability_runtime(raw)
775
+ ctx = ConfigContext.from_yaml(*config_paths)
776
+ app_cfg = ctx.section_optional(ConfigKey.APP, _WorkerAppConfig) or _WorkerAppConfig()
777
+ celery_cfg = ctx.section(ConfigKey.CELERY, CeleryConfig)
778
+ observability_runtime = _build_observability_runtime(ctx)
756
779
  async_runtime = _build_async_runtime(celery_cfg.runtime)
757
780
 
758
- resolved = _resolve_compilables_and_jobs(raw, jobs, use_cases)
781
+ resolved = _resolve_compilables_and_jobs(ctx, jobs, use_cases)
759
782
  all_compilables = _merge_unique(
760
783
  resolved.compilables,
761
784
  _use_cases_from_interfaces(interfaces),
762
785
  )
763
786
 
764
787
  for job_type in resolved.jobs:
765
- _apply_job_config_if_present(raw, job_type)
788
+ _apply_job_config_if_present(ctx, job_type)
766
789
 
767
- uow_factory, session_manager = _resolve_uow_factory(raw)
790
+ uow_factory, session_manager = _resolve_uow_factory(ctx)
768
791
  final_models, runtime_modules = _compile_db_layer(session_manager, resolved.models, modules)
769
792
 
770
793
  resolved = _WorkerResolved(
@@ -776,7 +799,7 @@ def bootstrap_worker(
776
799
  _emit_worker_init_graph(resolved)
777
800
 
778
801
  kernel = create_kernel(
779
- config=raw,
802
+ config=app_cfg,
780
803
  use_cases=resolved.compilables,
781
804
  modules=runtime_modules,
782
805
  metrics=metrics,
@@ -30,7 +30,6 @@ Typical YAML layout::
30
30
 
31
31
  from __future__ import annotations
32
32
 
33
- import sys
34
33
  from typing import TYPE_CHECKING, Any, Literal
35
34
 
36
35
  import msgspec
@@ -172,15 +171,6 @@ def apply_job_config(job_type: type[Job[Any]], cfg: JobConfig) -> None:
172
171
  setattr(job_type, class_var, value)
173
172
 
174
173
 
175
- def _build_backend_options(backend: str, use_uvloop: bool) -> dict[str, Any]:
176
- """Return AnyIO backend options for an async bridge."""
177
- if backend == "asyncio" and use_uvloop and sys.platform != "win32":
178
- import uvloop # guarded by sys_platform marker in pyproject.toml
179
-
180
- return {"loop_factory": uvloop.new_event_loop}
181
- return {}
182
-
183
-
184
174
  def create_celery_app(cfg: CeleryConfig) -> Celery:
185
175
  """Build a Celery application from a ``CeleryConfig``.
186
176
 
@@ -25,7 +25,7 @@ import inspect
25
25
  import time
26
26
  from contextvars import Token
27
27
  from dataclasses import dataclass, field
28
- from typing import TYPE_CHECKING, Any, ClassVar
28
+ from typing import TYPE_CHECKING, Any
29
29
 
30
30
  from celery import Celery # type: ignore[import-untyped]
31
31
  from celery.result import AsyncResult # type: ignore[import-untyped]
@@ -49,11 +49,6 @@ if TYPE_CHECKING:
49
49
  class _CeleryAsyncRuntime:
50
50
  """Per-process async bridge for Celery worker coroutines."""
51
51
 
52
- # Class-level guard: signals must be connected exactly once per process.
53
- # Stored on the class (not the instance) because it reflects process state,
54
- # not a property of any particular runtime object.
55
- _signals_connected: ClassVar[bool] = False
56
-
57
52
  backend: str = "asyncio"
58
53
  backend_options: dict[str, Any] = field(default_factory=dict)
59
54
  shutdown_timeout_ms: int | None = None
@@ -28,6 +28,7 @@ Thread safety:
28
28
  from __future__ import annotations
29
29
 
30
30
  import logging
31
+ import sys
31
32
  import threading
32
33
  from collections.abc import Coroutine
33
34
  from typing import Any, TypeVar, cast
@@ -39,6 +40,23 @@ logger = logging.getLogger(__name__)
39
40
  T = TypeVar("T")
40
41
 
41
42
 
43
+ def build_backend_options(backend: str, use_uvloop: bool) -> dict[str, Any]:
44
+ """Build AnyIO backend options for the shared async bridge contract.
45
+
46
+ Args:
47
+ backend: AnyIO backend name.
48
+ use_uvloop: Whether asyncio should use uvloop when available.
49
+
50
+ Returns:
51
+ A backend-options mapping suitable for :class:`AsyncBridge`.
52
+ """
53
+ if backend == "asyncio" and use_uvloop and sys.platform != "win32":
54
+ import uvloop # guarded by sys_platform marker in pyproject.toml
55
+
56
+ return {"loop_factory": uvloop.new_event_loop}
57
+ return {}
58
+
59
+
42
60
  class AsyncBridge:
43
61
  """Anyio blocking portal wrapper for sync-to-async execution.
44
62
 
@@ -94,8 +112,13 @@ class AsyncBridge:
94
112
  if self._closed:
95
113
  coro.close()
96
114
  raise RuntimeError("AsyncBridge has been shut down.")
115
+
116
+ async def _await_coro_with_timeout() -> T:
117
+ with anyio.fail_after(timeout):
118
+ return await coro
119
+
97
120
  if timeout is not None:
98
- return cast(T, self._portal.call(_await_with_timeout, coro, timeout))
121
+ return self._portal.call(_await_coro_with_timeout)
99
122
  return cast(T, self._portal.call(_await_coro, coro))
100
123
 
101
124
  @property
@@ -139,11 +162,6 @@ async def _await_coro(coro: Coroutine[Any, Any, T]) -> T:
139
162
  return await coro
140
163
 
141
164
 
142
- async def _await_with_timeout(coro: Coroutine[Any, Any, T], timeout: float) -> T: # noqa: S7483
143
- with anyio.fail_after(timeout):
144
- return await coro
145
-
146
-
147
165
  AsyncWorker = AsyncBridge
148
166
 
149
- __all__ = ["AsyncBridge", "AsyncWorker"]
167
+ __all__ = ["AsyncBridge", "AsyncWorker", "build_backend_options"]
@@ -4,8 +4,10 @@ from typing import Any
4
4
 
5
5
  import msgspec
6
6
 
7
+ from loom.core.model import LoomFrozenStruct
7
8
 
8
- class CacheConfig(msgspec.Struct, kw_only=True):
9
+
10
+ class CacheConfig(LoomFrozenStruct, frozen=True, kw_only=True):
9
11
  """Configuration for cache behaviour including TTLs and aiocache backend settings.
10
12
 
11
13
  Attributes:
@@ -0,0 +1,24 @@
1
+ """Compiler contracts shared by Loom domains.
2
+
3
+ Compilers translate a request object into an executable plan. The concrete
4
+ request and plan types vary by domain; this protocol only captures the
5
+ shape of the transformation.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Protocol, TypeVar
11
+
12
+ _RequestT = TypeVar("_RequestT", contravariant=True)
13
+ _PlanT = TypeVar("_PlanT", covariant=True)
14
+
15
+
16
+ class CompilerProtocol(Protocol[_RequestT, _PlanT]):
17
+ """Structural protocol for a compiler that materializes an execution plan."""
18
+
19
+ def compile(self, request: _RequestT) -> _PlanT:
20
+ """Transform *request* into an executable plan."""
21
+ ...
22
+
23
+
24
+ __all__ = ["CompilerProtocol"]