loom-kernel 0.7.0__tar.gz → 0.8.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 (760) hide show
  1. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.github/workflows/release.yml +30 -13
  2. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/CHANGELOG.md +109 -0
  3. loom_kernel-0.8.0/CHANGELOG_RELEASE.md +107 -0
  4. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/PKG-INFO +1 -1
  5. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/pyproject.toml +2 -2
  6. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/session_manager.py +47 -1
  7. loom_kernel-0.8.0/src/loom/core/schema/__init__.py +5 -0
  8. loom_kernel-0.8.0/src/loom/core/schema/schema_mode.py +22 -0
  9. loom_kernel-0.8.0/src/loom/etl/declarative/target/_schema_mode.py +5 -0
  10. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/__init__.py +23 -5
  11. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_adapter.py +4 -0
  12. loom_kernel-0.8.0/src/loom/streaming/bytewax/_resource_manager.py +160 -0
  13. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/_shared.py +9 -0
  14. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/dispatcher.py +6 -0
  15. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/routing.py +2 -1
  16. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/steps.py +59 -2
  17. loom_kernel-0.8.0/src/loom/streaming/bytewax/handlers/storage.py +196 -0
  18. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/__init__.py +4 -2
  19. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/_compiler.py +2 -0
  20. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/_plan.py +27 -1
  21. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/phases/build_plan.py +88 -35
  22. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/phases/validate.py +193 -73
  23. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/__init__.py +21 -3
  24. loom_kernel-0.8.0/src/loom/streaming/nodes/_decompose.py +89 -0
  25. loom_kernel-0.8.0/src/loom/streaming/nodes/_sink.py +120 -0
  26. loom_kernel-0.8.0/src/loom/streaming/nodes/_table/__init__.py +21 -0
  27. loom_kernel-0.8.0/src/loom/streaming/nodes/_table/common.py +737 -0
  28. loom_kernel-0.8.0/src/loom/streaming/nodes/_table/config.py +99 -0
  29. loom_kernel-0.8.0/tests/integration/streaming/test_into_table_integration.py +324 -0
  30. loom_kernel-0.8.0/tests/unit/streaming/bytewax/test_resource_manager.py +52 -0
  31. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_steps.py +1 -1
  32. loom_kernel-0.8.0/tests/unit/streaming/bytewax/test_storage.py +145 -0
  33. loom_kernel-0.8.0/tests/unit/streaming/compiler/test_async_walk.py +182 -0
  34. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/__init__.py +2 -0
  35. loom_kernel-0.8.0/tests/unit/streaming/flows/cases/explode.py +134 -0
  36. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/conftest.py +2 -0
  37. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/test_compiler_examples.py +13 -1
  38. loom_kernel-0.8.0/tests/unit/streaming/nodes/test_table_package.py +19 -0
  39. loom_kernel-0.8.0/tests/unit/testing/__init__.py +0 -0
  40. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/uv.lock +1 -1
  41. loom_kernel-0.7.0/CHANGELOG_RELEASE.md +0 -96
  42. loom_kernel-0.7.0/src/loom/etl/declarative/target/_schema_mode.py +0 -23
  43. loom_kernel-0.7.0/src/loom/streaming/bytewax/_resource_manager.py +0 -68
  44. loom_kernel-0.7.0/tests/unit/streaming/compiler/test_async_walk.py +0 -91
  45. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.github/workflows/ci-main.yml +0 -0
  46. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.github/workflows/ci-pr.yml +0 -0
  47. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.github/workflows/docs.yml +0 -0
  48. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.gitignore +0 -0
  49. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.pre-commit-config.yaml +0 -0
  50. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/.readthedocs.yaml +0 -0
  51. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/LICENSE +0 -0
  52. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/Makefile +0 -0
  53. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/README.md +0 -0
  54. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/codecov.yml +0 -0
  55. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/_static/.gitkeep +0 -0
  56. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/_static/custom.css +0 -0
  57. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/_static/logo-transparent.png +0 -0
  58. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/_static/logo.svg +0 -0
  59. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/architecture/adr/README.md +0 -0
  60. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/architecture/clean-architecture.md +0 -0
  61. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/architecture/overview.md +0 -0
  62. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/conf.py +0 -0
  63. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/etl/examples.md +0 -0
  64. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/etl/pipelines.md +0 -0
  65. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/etl/testing.md +0 -0
  66. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/examples-repo/index.md +0 -0
  67. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/getting-started/etl.md +0 -0
  68. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/getting-started/rest.md +0 -0
  69. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/getting-started/streaming.md +0 -0
  70. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/autocrud.md +0 -0
  71. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/celery.md +0 -0
  72. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/etl.md +0 -0
  73. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/fake-repo-examples.md +0 -0
  74. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/quickstart.md +0 -0
  75. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/guides/use-case-dsl.md +0 -0
  76. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/index.rst +0 -0
  77. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/overview.md +0 -0
  78. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/core.rst +0 -0
  79. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/etl.rst +0 -0
  80. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/repository.rst +0 -0
  81. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/rest.rst +0 -0
  82. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/streaming.rst +0 -0
  83. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/api/testing.rst +0 -0
  84. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/reference/index.rst +0 -0
  85. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/requirements.txt +0 -0
  86. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/rest/autocrud.md +0 -0
  87. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/rest/celery.md +0 -0
  88. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/rest/examples.md +0 -0
  89. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/rest/testing.md +0 -0
  90. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/rest/use-case-dsl.md +0 -0
  91. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/docs/streaming/bytewax.md +0 -0
  92. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/sonar-project.properties +0 -0
  93. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/__init__.py +0 -0
  94. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/__init__.py +0 -0
  95. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/auto.py +0 -0
  96. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/bootstrap.py +0 -0
  97. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/config.py +0 -0
  98. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/constants.py +0 -0
  99. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/runner.py +0 -0
  100. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/celery/service.py +0 -0
  101. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/async_bridge.py +0 -0
  102. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/backend/__init__.py +0 -0
  103. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/backend/core_model.py +0 -0
  104. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/backend/protocol.py +0 -0
  105. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/backend/sqlalchemy.py +0 -0
  106. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/bootstrap/__init__.py +0 -0
  107. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/bootstrap/bootstrap.py +0 -0
  108. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/bootstrap/kernel.py +0 -0
  109. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/__init__.py +0 -0
  110. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/abc/__init__.py +0 -0
  111. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/abc/backend.py +0 -0
  112. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/abc/config.py +0 -0
  113. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/abc/dependency.py +0 -0
  114. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/codec.py +0 -0
  115. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/decorators.py +0 -0
  116. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/dependency.py +0 -0
  117. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/gateway.py +0 -0
  118. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/keys.py +0 -0
  119. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/repository.py +0 -0
  120. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/cache/serializer.py +0 -0
  121. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/command/__init__.py +0 -0
  122. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/command/adapter.py +0 -0
  123. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/command/base.py +0 -0
  124. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/command/field.py +0 -0
  125. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/command/introspection.py +0 -0
  126. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/compiler.py +0 -0
  127. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/__init__.py +0 -0
  128. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/binder.py +0 -0
  129. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/configurable.py +0 -0
  130. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/context.py +0 -0
  131. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/errors.py +0 -0
  132. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/keys.py +0 -0
  133. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/loader.py +0 -0
  134. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/model.py +0 -0
  135. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/observability.py +0 -0
  136. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/config/resolver.py +0 -0
  137. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/contracts/__init__.py +0 -0
  138. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/contracts/manifest.py +0 -0
  139. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/di/__init__.py +0 -0
  140. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/di/container.py +0 -0
  141. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/di/scope.py +0 -0
  142. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/__init__.py +0 -0
  143. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/_utils.py +0 -0
  144. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/base.py +0 -0
  145. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/interfaces.py +0 -0
  146. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/manifest.py +0 -0
  147. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/discovery/modules.py +0 -0
  148. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/__init__.py +0 -0
  149. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/compilable.py +0 -0
  150. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/compiler.py +0 -0
  151. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/events.py +0 -0
  152. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/executor.py +0 -0
  153. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/metrics.py +0 -0
  154. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/engine/plan.py +0 -0
  155. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/errors/__init__.py +0 -0
  156. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/errors/codes.py +0 -0
  157. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/errors/errors.py +0 -0
  158. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/expr/__init__.py +0 -0
  159. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/expr/eval.py +0 -0
  160. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/expr/nodes.py +0 -0
  161. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/expr/refs.py +0 -0
  162. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/__init__.py +0 -0
  163. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/callback.py +0 -0
  164. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/context.py +0 -0
  165. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/handle.py +0 -0
  166. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/job.py +0 -0
  167. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/job/service.py +0 -0
  168. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/logger/__init__.py +0 -0
  169. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/logger/abc.py +0 -0
  170. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/logger/config.py +0 -0
  171. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/logger/registry.py +0 -0
  172. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/logger/structlogger.py +0 -0
  173. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/__init__.py +0 -0
  174. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/base.py +0 -0
  175. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/enums.py +0 -0
  176. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/field.py +0 -0
  177. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/introspection.py +0 -0
  178. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/projection.py +0 -0
  179. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/relation.py +0 -0
  180. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/struct.py +0 -0
  181. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/timestamped.py +0 -0
  182. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/types.py +0 -0
  183. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/model/types_postgres.py +0 -0
  184. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/__init__.py +0 -0
  185. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/config.py +0 -0
  186. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/event.py +0 -0
  187. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/observer/__init__.py +0 -0
  188. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/observer/noop.py +0 -0
  189. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/observer/otel.py +0 -0
  190. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/observer/structlog.py +0 -0
  191. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/protocol.py +0 -0
  192. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/runtime.py +0 -0
  193. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/observability/topology.py +0 -0
  194. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/projection/__init__.py +0 -0
  195. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/projection/loaders.py +0 -0
  196. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/projection/runtime.py +0 -0
  197. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/__init__.py +0 -0
  198. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/abc/__init__.py +0 -0
  199. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/abc/query.py +0 -0
  200. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/abc/repo_for.py +0 -0
  201. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/abc/repository.py +0 -0
  202. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/mutation.py +0 -0
  203. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/registration.py +0 -0
  204. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/registry.py +0 -0
  205. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/__init__.py +0 -0
  206. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/integrity.py +0 -0
  207. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/loaders.py +0 -0
  208. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/mixins.py +0 -0
  209. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/model.py +0 -0
  210. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/profile_loader.py +0 -0
  211. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/projection.py +0 -0
  212. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/__init__.py +0 -0
  213. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/compiler.py +0 -0
  214. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/cursor.py +0 -0
  215. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/errors.py +0 -0
  216. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/filters.py +0 -0
  217. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/ordering.py +0 -0
  218. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/paths.py +0 -0
  219. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/query_compiler/subquery.py +0 -0
  220. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/registry.py +0 -0
  221. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/repository.py +0 -0
  222. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/transactional.py +0 -0
  223. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/repository/sqlalchemy/uow.py +0 -0
  224. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/response/__init__.py +0 -0
  225. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/response/base.py +0 -0
  226. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/routing/__init__.py +0 -0
  227. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/routing/ref.py +0 -0
  228. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/routing/resolver.py +0 -0
  229. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/runner.py +0 -0
  230. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/tracing/__init__.py +0 -0
  231. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/tracing/context.py +0 -0
  232. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/transport/__init__.py +0 -0
  233. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/transport/adapter.py +0 -0
  234. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/uow/__init__.py +0 -0
  235. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/uow/abc.py +0 -0
  236. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/uow/context.py +0 -0
  237. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/__init__.py +0 -0
  238. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/_predicates.py +0 -0
  239. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/compute.py +0 -0
  240. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/constants.py +0 -0
  241. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/factory.py +0 -0
  242. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/field_ref.py +0 -0
  243. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/invoker.py +0 -0
  244. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/keys.py +0 -0
  245. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/markers.py +0 -0
  246. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/registry.py +0 -0
  247. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/rule.py +0 -0
  248. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/core/use_case/use_case.py +0 -0
  249. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/__init__.py +0 -0
  250. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/__init__.py +0 -0
  251. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_format_registry.py +0 -0
  252. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/__init__.py +0 -0
  253. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/_common.py +0 -0
  254. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/_log.py +0 -0
  255. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/_ops.py +0 -0
  256. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/_snapshot.py +0 -0
  257. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_historify/_transform.py +0 -0
  258. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_merge.py +0 -0
  259. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_predicate.py +0 -0
  260. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_schema_aligner/__init__.py +0 -0
  261. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_schema_aligner/_aligner.py +0 -0
  262. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_schema_aligner/_policy.py +0 -0
  263. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/_write_policy.py +0 -0
  264. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/__init__.py +0 -0
  265. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_dtype.py +0 -0
  266. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_file_writer.py +0 -0
  267. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_historify.py +0 -0
  268. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_predicate.py +0 -0
  269. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_reader.py +0 -0
  270. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_schema.py +0 -0
  271. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_schema_aligner.py +0 -0
  272. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/_writer.py +0 -0
  273. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/polars/provider.py +0 -0
  274. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/__init__.py +0 -0
  275. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_dtype.py +0 -0
  276. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_historify.py +0 -0
  277. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_reader.py +0 -0
  278. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_schema.py +0 -0
  279. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_schema_aligner.py +0 -0
  280. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/_writer.py +0 -0
  281. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/backends/spark/provider.py +0 -0
  282. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/__init__.py +0 -0
  283. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_backends/_polars.py +0 -0
  284. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_backends/_spark.py +0 -0
  285. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_cleaners.py +0 -0
  286. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_paths.py +0 -0
  287. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_scope.py +0 -0
  288. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/checkpoint/_store.py +0 -0
  289. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/__init__.py +0 -0
  290. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_binding.py +0 -0
  291. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_compiler.py +0 -0
  292. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_errors.py +0 -0
  293. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_plan.py +0 -0
  294. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_validators.py +0 -0
  295. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_validators_plan.py +0 -0
  296. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/compiler/_validators_step.py +0 -0
  297. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/__init__.py +0 -0
  298. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/_format.py +0 -0
  299. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/_read_options.py +0 -0
  300. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/_utils.py +0 -0
  301. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/_write_options.py +0 -0
  302. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/expr/__init__.py +0 -0
  303. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/expr/_params.py +0 -0
  304. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/expr/_predicate.py +0 -0
  305. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/expr/_predicate_dialect.py +0 -0
  306. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/expr/_refs.py +0 -0
  307. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/source/__init__.py +0 -0
  308. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/source/_from.py +0 -0
  309. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/source/_specs.py +0 -0
  310. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/__init__.py +0 -0
  311. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_file.py +0 -0
  312. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/__init__.py +0 -0
  313. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/_builder.py +0 -0
  314. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/_enums.py +0 -0
  315. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/_errors.py +0 -0
  316. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/_report.py +0 -0
  317. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_history/_spec.py +0 -0
  318. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_into.py +0 -0
  319. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_table.py +0 -0
  320. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/declarative/target/_temp.py +0 -0
  321. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/executor/__init__.py +0 -0
  322. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/executor/_dispatcher.py +0 -0
  323. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/executor/_executor.py +0 -0
  324. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/__init__.py +0 -0
  325. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/_config.py +0 -0
  326. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/_observer.py +0 -0
  327. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/_records.py +0 -0
  328. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/sinks/__init__.py +0 -0
  329. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/sinks/_protocol.py +0 -0
  330. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/sinks/_table.py +0 -0
  331. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/lineage/sinks/_writer.py +0 -0
  332. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/__init__.py +0 -0
  333. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_generics.py +0 -0
  334. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_params.py +0 -0
  335. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_pipeline.py +0 -0
  336. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_process.py +0 -0
  337. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_sql.py +0 -0
  338. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_step.py +0 -0
  339. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/pipeline/_step_sql.py +0 -0
  340. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/__init__.py +0 -0
  341. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/_providers.py +0 -0
  342. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/_wiring.py +0 -0
  343. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/config_loader.py +0 -0
  344. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/core.py +0 -0
  345. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/errors.py +0 -0
  346. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runner/filtering.py +0 -0
  347. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runtime/__init__.py +0 -0
  348. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/runtime/contracts.py +0 -0
  349. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/schema/__init__.py +0 -0
  350. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/schema/_contract.py +0 -0
  351. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/schema/_schema.py +0 -0
  352. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/storage/__init__.py +0 -0
  353. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/storage/_config.py +0 -0
  354. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/storage/_file_locator.py +0 -0
  355. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/storage/_locator.py +0 -0
  356. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/storage/routing.py +0 -0
  357. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/__init__.py +0 -0
  358. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/_result.py +0 -0
  359. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/_runners.py +0 -0
  360. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/_scenario.py +0 -0
  361. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/_stubs.py +0 -0
  362. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/etl/testing/spark.py +0 -0
  363. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/prometheus/__init__.py +0 -0
  364. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/prometheus/adapter.py +0 -0
  365. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/prometheus/kafka.py +0 -0
  366. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/prometheus/lifecycle.py +0 -0
  367. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/prometheus/middleware.py +0 -0
  368. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/__init__.py +0 -0
  369. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/adapter.py +0 -0
  370. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/autocrud.py +0 -0
  371. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/compiler.py +0 -0
  372. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/constants.py +0 -0
  373. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/errors.py +0 -0
  374. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/__init__.py +0 -0
  375. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/app.py +0 -0
  376. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/auto.py +0 -0
  377. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/openapi.py +0 -0
  378. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/response.py +0 -0
  379. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/fastapi/router_runtime.py +0 -0
  380. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/middleware.py +0 -0
  381. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/model.py +0 -0
  382. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/rest/rest_adapter.py +0 -0
  383. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/__init__.py +0 -0
  384. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_commit_tracker.py +0 -0
  385. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_dlq.py +0 -0
  386. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_error_boundary.py +0 -0
  387. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_operators.py +0 -0
  388. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/_runtime_io.py +0 -0
  389. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/__init__.py +0 -0
  390. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/boundary.py +0 -0
  391. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/scopes.py +0 -0
  392. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/handlers/shapes.py +0 -0
  393. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/bytewax/runner.py +0 -0
  394. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/compiler/_bindings.py +0 -0
  395. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/core/__init__.py +0 -0
  396. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/core/_errors.py +0 -0
  397. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/core/_exceptions.py +0 -0
  398. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/core/_message.py +0 -0
  399. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/core/_typing.py +0 -0
  400. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/graph/__init__.py +0 -0
  401. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/graph/_flow.py +0 -0
  402. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/__init__.py +0 -0
  403. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_codec.py +0 -0
  404. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_config.py +0 -0
  405. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_errors.py +0 -0
  406. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_key_resolver.py +0 -0
  407. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_message.py +0 -0
  408. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_record.py +0 -0
  409. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/_wire.py +0 -0
  410. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/client/__init__.py +0 -0
  411. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/client/_consumer.py +0 -0
  412. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/client/_producer.py +0 -0
  413. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/client/_protocol.py +0 -0
  414. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/message/__init__.py +0 -0
  415. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/message/_consumer.py +0 -0
  416. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/message/_producer.py +0 -0
  417. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/kafka/message/_protocol.py +0 -0
  418. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_boundary.py +0 -0
  419. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_broadcast.py +0 -0
  420. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_capabilities.py +0 -0
  421. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_expr_eval.py +0 -0
  422. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_fork.py +0 -0
  423. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_helpers.py +0 -0
  424. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_protocols.py +0 -0
  425. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_router.py +0 -0
  426. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_shape.py +0 -0
  427. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_step.py +0 -0
  428. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/_with.py +0 -0
  429. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/nodes/refs.py +0 -0
  430. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/streaming/testing.py +0 -0
  431. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/__init__.py +0 -0
  432. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/golden.py +0 -0
  433. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/http_harness.py +0 -0
  434. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/in_memory.py +0 -0
  435. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/repository_harness.py +0 -0
  436. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/src/loom/testing/runner.py +0 -0
  437. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/__init__.py +0 -0
  438. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/conftest.py +0 -0
  439. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/golden/__init__.py +0 -0
  440. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/golden/baselines/.gitkeep +0 -0
  441. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/golden/outputs/.gitkeep +0 -0
  442. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/golden/plans/.gitkeep +0 -0
  443. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/helpers/__init__.py +0 -0
  444. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/__init__.py +0 -0
  445. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/celery_bootstrap/__init__.py +0 -0
  446. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/celery_bootstrap/config/conf.celery.integration.yaml +0 -0
  447. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/celery_bootstrap/test_auto_create_app_integration.py +0 -0
  448. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/celery_bootstrap/test_bootstrap_worker.py +0 -0
  449. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/conftest.py +0 -0
  450. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/__init__.py +0 -0
  451. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/bootstrap/__init__.py +0 -0
  452. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/bootstrap/test_bootstrap_integration.py +0 -0
  453. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/repository/__init__.py +0 -0
  454. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/repository/sqlalchemy/__init__.py +0 -0
  455. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/repository/sqlalchemy/conftest.py +0 -0
  456. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/repository/sqlalchemy/test_cache_integration.py +0 -0
  457. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/repository/sqlalchemy/test_repository_integration.py +0 -0
  458. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/rest/__init__.py +0 -0
  459. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/rest/test_auto_interface_integration.py +0 -0
  460. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/rest/test_fastapi_app_integration.py +0 -0
  461. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/rest/test_rest_error_mapping.py +0 -0
  462. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/rest/test_rest_observability.py +0 -0
  463. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/use_case/__init__.py +0 -0
  464. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/use_case/test_custom_repository_integration.py +0 -0
  465. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/core/use_case/test_use_case_crud_integration.py +0 -0
  466. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/etl/__init__.py +0 -0
  467. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/etl/test_runner_integration.py +0 -0
  468. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/__init__.py +0 -0
  469. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/config/__init__.py +0 -0
  470. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/config/conf.interfaces.yaml +0 -0
  471. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/config/conf.manifest.yaml +0 -0
  472. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/config/conf.modules.yaml +0 -0
  473. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/config/conf.yaml +0 -0
  474. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/main.py +0 -0
  475. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/manifest.py +0 -0
  476. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/__init__.py +0 -0
  477. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/category/__init__.py +0 -0
  478. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/category/model.py +0 -0
  479. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/category/schemas.py +0 -0
  480. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/interface.py +0 -0
  481. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/jobs.py +0 -0
  482. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/model.py +0 -0
  483. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/relations.py +0 -0
  484. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/repository.py +0 -0
  485. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/repository_contract.py +0 -0
  486. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/review/__init__.py +0 -0
  487. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/review/model.py +0 -0
  488. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/review/schemas.py +0 -0
  489. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/schemas.py +0 -0
  490. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/fake_repo/product/use_cases.py +0 -0
  491. {loom_kernel-0.7.0/tests/unit → loom_kernel-0.8.0/tests/integration/streaming}/__init__.py +0 -0
  492. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/support/__init__.py +0 -0
  493. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/integration/support/logical_repo_fixtures.py +0 -0
  494. {loom_kernel-0.7.0/tests/unit/celery_bootstrap → loom_kernel-0.8.0/tests/unit}/__init__.py +0 -0
  495. {loom_kernel-0.7.0/tests/unit/celery_jobs → loom_kernel-0.8.0/tests/unit/celery_bootstrap}/__init__.py +0 -0
  496. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_bootstrap/test_async_runtime.py +0 -0
  497. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_bootstrap/test_bootstrap.py +0 -0
  498. {loom_kernel-0.7.0/tests/unit/core → loom_kernel-0.8.0/tests/unit/celery_jobs}/__init__.py +0 -0
  499. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_jobs/test_auto.py +0 -0
  500. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_jobs/test_celery_service.py +0 -0
  501. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_jobs/test_config.py +0 -0
  502. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/celery_jobs/test_runner.py +0 -0
  503. {loom_kernel-0.7.0/tests/unit/core/backend → loom_kernel-0.8.0/tests/unit/core}/__init__.py +0 -0
  504. {loom_kernel-0.7.0/tests/unit/core/bootstrap → loom_kernel-0.8.0/tests/unit/core/backend}/__init__.py +0 -0
  505. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/backend/test_backend_compiler.py +0 -0
  506. {loom_kernel-0.7.0/tests/unit/core/cache → loom_kernel-0.8.0/tests/unit/core/bootstrap}/__init__.py +0 -0
  507. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/bootstrap/test_bootstrap.py +0 -0
  508. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/bootstrap/test_bootstrap_metrics.py +0 -0
  509. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/bootstrap/test_kernel.py +0 -0
  510. {loom_kernel-0.7.0/tests/unit/core/command → loom_kernel-0.8.0/tests/unit/core/cache}/__init__.py +0 -0
  511. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/cache/test_cached_repository.py +0 -0
  512. {loom_kernel-0.7.0/tests/unit/core/config → loom_kernel-0.8.0/tests/unit/core/command}/__init__.py +0 -0
  513. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/command/test_command_base.py +0 -0
  514. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/command/test_command_field.py +0 -0
  515. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/command/test_command_patch.py +0 -0
  516. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/command/test_introspection.py +0 -0
  517. {loom_kernel-0.7.0/tests/unit/core/di → loom_kernel-0.8.0/tests/unit/core/config}/__init__.py +0 -0
  518. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/config/test_binder.py +0 -0
  519. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/config/test_config.py +0 -0
  520. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/config/test_configurable.py +0 -0
  521. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/config/test_context.py +0 -0
  522. {loom_kernel-0.7.0/tests/unit/core/discovery → loom_kernel-0.8.0/tests/unit/core/di}/__init__.py +0 -0
  523. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/di/test_container.py +0 -0
  524. {loom_kernel-0.7.0/tests/unit/core/engine → loom_kernel-0.8.0/tests/unit/core/discovery}/__init__.py +0 -0
  525. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/discovery/test_manifest.py +0 -0
  526. {loom_kernel-0.7.0/tests/unit/core/errors → loom_kernel-0.8.0/tests/unit/core/engine}/__init__.py +0 -0
  527. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_compiler.py +0 -0
  528. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_executor.py +0 -0
  529. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_executor_trace.py +0 -0
  530. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_executor_uow.py +0 -0
  531. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_metrics.py +0 -0
  532. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/engine/test_plan.py +0 -0
  533. {loom_kernel-0.7.0/tests/unit/core/expr → loom_kernel-0.8.0/tests/unit/core/errors}/__init__.py +0 -0
  534. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/errors/test_errors.py +0 -0
  535. {loom_kernel-0.7.0/tests/unit/core/job → loom_kernel-0.8.0/tests/unit/core/expr}/__init__.py +0 -0
  536. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/expr/test_expr.py +0 -0
  537. {loom_kernel-0.7.0/tests/unit/core/logger → loom_kernel-0.8.0/tests/unit/core/job}/__init__.py +0 -0
  538. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/conftest.py +0 -0
  539. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/test_callback.py +0 -0
  540. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/test_context.py +0 -0
  541. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/test_handle.py +0 -0
  542. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/test_inline_service.py +0 -0
  543. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/job/test_job.py +0 -0
  544. {loom_kernel-0.7.0/tests/unit/core/model → loom_kernel-0.8.0/tests/unit/core/logger}/__init__.py +0 -0
  545. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/logger/test_config.py +0 -0
  546. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/logger/test_registry.py +0 -0
  547. {loom_kernel-0.7.0/tests/unit/core/observability → loom_kernel-0.8.0/tests/unit/core/model}/__init__.py +0 -0
  548. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/model/test_model.py +0 -0
  549. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/model/test_struct.py +0 -0
  550. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/model/test_timestamped.py +0 -0
  551. {loom_kernel-0.7.0/tests/unit/core/projection → loom_kernel-0.8.0/tests/unit/core/observability}/__init__.py +0 -0
  552. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/observability/test_observers.py +0 -0
  553. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/observability/test_runtime.py +0 -0
  554. {loom_kernel-0.7.0/tests/unit/core/repository → loom_kernel-0.8.0/tests/unit/core/projection}/__init__.py +0 -0
  555. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/projection/test_runtime.py +0 -0
  556. {loom_kernel-0.7.0/tests/unit/core/repository/abc → loom_kernel-0.8.0/tests/unit/core/repository}/__init__.py +0 -0
  557. {loom_kernel-0.7.0/tests/unit/core/repository/sqlalchemy → loom_kernel-0.8.0/tests/unit/core/repository/abc}/__init__.py +0 -0
  558. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/abc/conftest.py +0 -0
  559. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/abc/test_query.py +0 -0
  560. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/abc/test_repository_contract.py +0 -0
  561. {loom_kernel-0.7.0/tests/unit/core/routing → loom_kernel-0.8.0/tests/unit/core/repository/sqlalchemy}/__init__.py +0 -0
  562. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/sqlalchemy/conftest.py +0 -0
  563. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/sqlalchemy/test_loaders.py +0 -0
  564. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/sqlalchemy/test_repository.py +0 -0
  565. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/repository/sqlalchemy/test_transactional.py +0 -0
  566. {loom_kernel-0.7.0/tests/unit/core/tracing → loom_kernel-0.8.0/tests/unit/core/routing}/__init__.py +0 -0
  567. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/routing/test_routing.py +0 -0
  568. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/test_async_bridge.py +0 -0
  569. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/test_compiler_contracts.py +0 -0
  570. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/test_runner_contracts.py +0 -0
  571. {loom_kernel-0.7.0/tests/unit/core/uow → loom_kernel-0.8.0/tests/unit/core/tracing}/__init__.py +0 -0
  572. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/tracing/test_context.py +0 -0
  573. {loom_kernel-0.7.0/tests/unit/core/use_case → loom_kernel-0.8.0/tests/unit/core/uow}/__init__.py +0 -0
  574. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/uow/test_executor_uow.py +0 -0
  575. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/uow/test_sqlalchemy_uow.py +0 -0
  576. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/uow/test_uow_protocols.py +0 -0
  577. {loom_kernel-0.7.0/tests/unit/etl → loom_kernel-0.8.0/tests/unit/core/use_case}/__init__.py +0 -0
  578. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_compute.py +0 -0
  579. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_factory.py +0 -0
  580. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_field_ref.py +0 -0
  581. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_invoker.py +0 -0
  582. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_markers.py +0 -0
  583. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_rule.py +0 -0
  584. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/core/use_case/test_use_case.py +0 -0
  585. {loom_kernel-0.7.0/tests/unit/etl/backends → loom_kernel-0.8.0/tests/unit/etl}/__init__.py +0 -0
  586. {loom_kernel-0.7.0/tests/unit/etl/backends/test_polars → loom_kernel-0.8.0/tests/unit/etl/backends}/__init__.py +0 -0
  587. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/_historify_contract.py +0 -0
  588. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_historify_common.py +0 -0
  589. {loom_kernel-0.7.0/tests/unit/etl/backends/test_spark → loom_kernel-0.8.0/tests/unit/etl/backends/test_polars}/__init__.py +0 -0
  590. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/conftest.py +0 -0
  591. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_apply_schema.py +0 -0
  592. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_backend.py +0 -0
  593. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_dtype.py +0 -0
  594. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_file_writer.py +0 -0
  595. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_historify_polars.py +0 -0
  596. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_predicate_pushdown.py +0 -0
  597. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_reader_columns.py +0 -0
  598. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_reader_json_columns.py +0 -0
  599. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_step_execution.py +0 -0
  600. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_upsert_writer.py +0 -0
  601. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_polars/test_writer_to_frame.py +0 -0
  602. {loom_kernel-0.7.0/tests/unit/etl/checkpoint → loom_kernel-0.8.0/tests/unit/etl/backends/test_spark}/__init__.py +0 -0
  603. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/conftest.py +0 -0
  604. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/test_dtype.py +0 -0
  605. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/test_historify_spark.py +0 -0
  606. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/test_spark_apply_schema.py +0 -0
  607. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/test_step_execution.py +0 -0
  608. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_spark/test_writer_to_frame.py +0 -0
  609. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/backends/test_write_policy_historify.py +0 -0
  610. {loom_kernel-0.7.0/tests/unit/etl/checkpoint/backends → loom_kernel-0.8.0/tests/unit/etl/checkpoint}/__init__.py +0 -0
  611. {loom_kernel-0.7.0/tests/unit/etl/compiler → loom_kernel-0.8.0/tests/unit/etl/checkpoint/backends}/__init__.py +0 -0
  612. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/checkpoint/backends/test_checkpoint_polars.py +0 -0
  613. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/checkpoint/test_checkpoint_paths.py +0 -0
  614. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/checkpoint/test_cleaners.py +0 -0
  615. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/checkpoint/test_store.py +0 -0
  616. {loom_kernel-0.7.0/tests/unit/etl/io → loom_kernel-0.8.0/tests/unit/etl/compiler}/__init__.py +0 -0
  617. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_catalog_validator.py +0 -0
  618. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_compiler.py +0 -0
  619. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_compiler_catalog.py +0 -0
  620. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_compiler_upsert.py +0 -0
  621. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_errors.py +0 -0
  622. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_errors_additional_factories.py +0 -0
  623. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_errors_runtime_factories.py +0 -0
  624. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_historify_validator.py +0 -0
  625. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_param_exprs_validator.py +0 -0
  626. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_plan_traversal.py +0 -0
  627. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_step_validator.py +0 -0
  628. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_structural.py +0 -0
  629. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_temp_validator.py +0 -0
  630. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/compiler/test_upsert_validator.py +0 -0
  631. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/conftest.py +0 -0
  632. {loom_kernel-0.7.0/tests/unit/etl/schema → loom_kernel-0.8.0/tests/unit/etl/io}/__init__.py +0 -0
  633. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_history_target.py +0 -0
  634. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_source.py +0 -0
  635. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_source_json.py +0 -0
  636. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_source_options.py +0 -0
  637. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_target.py +0 -0
  638. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_utils.py +0 -0
  639. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/io/test_variants.py +0 -0
  640. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/lineage/test_observer.py +0 -0
  641. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/lineage/test_records.py +0 -0
  642. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/lineage/test_store.py +0 -0
  643. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/pipeline/__init__.py +0 -0
  644. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/pipeline/test_pipeline_process.py +0 -0
  645. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/pipeline/test_proxy.py +0 -0
  646. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/pipeline/test_step.py +0 -0
  647. {loom_kernel-0.7.0/tests/unit/etl/sql → loom_kernel-0.8.0/tests/unit/etl/schema}/__init__.py +0 -0
  648. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/schema/test_contract.py +0 -0
  649. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/schema/test_schema.py +0 -0
  650. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/schema/test_table.py +0 -0
  651. {loom_kernel-0.7.0/tests/unit/etl/storage → loom_kernel-0.8.0/tests/unit/etl/sql}/__init__.py +0 -0
  652. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/sql/test_merge.py +0 -0
  653. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/sql/test_predicate.py +0 -0
  654. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/sql/test_predicate_dialect.py +0 -0
  655. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/sql/test_sql_runtime.py +0 -0
  656. {loom_kernel-0.7.0/tests/unit/etl/testing → loom_kernel-0.8.0/tests/unit/etl/storage}/__init__.py +0 -0
  657. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_backend_factory.py +0 -0
  658. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_io_protocols.py +0 -0
  659. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_locator.py +0 -0
  660. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_observability_and_protocols.py +0 -0
  661. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_route_build.py +0 -0
  662. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_schema_readers.py +0 -0
  663. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/storage/test_storage_config.py +0 -0
  664. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_config_loader.py +0 -0
  665. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_executor.py +0 -0
  666. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_format_registry.py +0 -0
  667. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_module_contracts.py +0 -0
  668. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_public_api_discovery.py +0 -0
  669. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_record_schema_coverage.py +0 -0
  670. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_runner.py +0 -0
  671. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_runner_errors.py +0 -0
  672. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/test_spark_testing.py +0 -0
  673. {loom_kernel-0.7.0/tests/unit/prometheus → loom_kernel-0.8.0/tests/unit/etl/testing}/__init__.py +0 -0
  674. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/testing/test_runners.py +0 -0
  675. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/testing/test_scenario_and_stubs.py +0 -0
  676. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/etl/testing/test_spark_helpers.py +0 -0
  677. {loom_kernel-0.7.0/tests/unit/rest → loom_kernel-0.8.0/tests/unit/prometheus}/__init__.py +0 -0
  678. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/prometheus/test_adapter.py +0 -0
  679. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/prometheus/test_middleware.py +0 -0
  680. {loom_kernel-0.7.0/tests/unit/streaming/bytewax → loom_kernel-0.8.0/tests/unit/rest}/__init__.py +0 -0
  681. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_autocrud.py +0 -0
  682. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_fastapi_auto_logger.py +0 -0
  683. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_middleware.py +0 -0
  684. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_pydantic_adapter.py +0 -0
  685. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_response.py +0 -0
  686. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_rest_adapter.py +0 -0
  687. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_rest_compiler.py +0 -0
  688. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_rest_model.py +0 -0
  689. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/rest/test_router_runtime.py +0 -0
  690. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/__init__.py +0 -0
  691. {loom_kernel-0.7.0/tests/unit/streaming/compiler → loom_kernel-0.8.0/tests/unit/streaming/bytewax}/__init__.py +0 -0
  692. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/cases.py +0 -0
  693. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/conftest.py +0 -0
  694. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_adapter.py +0 -0
  695. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_batch_key.py +0 -0
  696. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_bytewax_dispatcher.py +0 -0
  697. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_collect_batch.py +0 -0
  698. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_dlq.py +0 -0
  699. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_error_boundary.py +0 -0
  700. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_operators.py +0 -0
  701. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_runner.py +0 -0
  702. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_runtime_io.py +0 -0
  703. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_runtime_sink.py +0 -0
  704. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/bytewax/test_runtime_source.py +0 -0
  705. {loom_kernel-0.7.0/tests/unit/streaming/contracts → loom_kernel-0.8.0/tests/unit/streaming/compiler}/__init__.py +0 -0
  706. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/cases.py +0 -0
  707. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_basics.py +0 -0
  708. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_config_bindings.py +0 -0
  709. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_multi_source.py +0 -0
  710. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_router.py +0 -0
  711. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_window.py +0 -0
  712. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/compiler/test_with.py +0 -0
  713. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/conftest.py +0 -0
  714. {loom_kernel-0.7.0/tests/unit/streaming/nodes → loom_kernel-0.8.0/tests/unit/streaming/contracts}/__init__.py +0 -0
  715. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/contracts/cases.py +0 -0
  716. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/contracts/test_boundary.py +0 -0
  717. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/contracts/test_message.py +0 -0
  718. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/contracts/test_multi_boundary.py +0 -0
  719. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/contracts/test_steps.py +0 -0
  720. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/__init__.py +0 -0
  721. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/batch.py +0 -0
  722. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/fork.py +0 -0
  723. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/router.py +0 -0
  724. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/shared.py +0 -0
  725. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/cases/simple.py +0 -0
  726. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/flows/test_flow_examples.py +0 -0
  727. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/__init__.py +0 -0
  728. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/cases.py +0 -0
  729. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/conftest.py +0 -0
  730. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/fakes.py +0 -0
  731. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_client.py +0 -0
  732. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_config.py +0 -0
  733. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_key_resolver.py +0 -0
  734. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_message.py +0 -0
  735. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_message_client.py +0 -0
  736. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_multi_wire.py +0 -0
  737. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_observability.py +0 -0
  738. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_settings.py +0 -0
  739. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/kafka/test_wire.py +0 -0
  740. {loom_kernel-0.7.0/tests/unit/streaming/observability → loom_kernel-0.8.0/tests/unit/streaming/nodes}/__init__.py +0 -0
  741. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/nodes/conftest.py +0 -0
  742. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/nodes/test_broadcast.py +0 -0
  743. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/nodes/test_logging.py +0 -0
  744. {loom_kernel-0.7.0/tests/unit/streaming/support → loom_kernel-0.8.0/tests/unit/streaming/observability}/__init__.py +0 -0
  745. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/cases.py +0 -0
  746. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/conftest.py +0 -0
  747. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/test_observability_runner.py +0 -0
  748. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/test_protocols.py +0 -0
  749. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/test_registry.py +0 -0
  750. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/observability/test_structlog.py +0 -0
  751. {loom_kernel-0.7.0/tests/unit/testing → loom_kernel-0.8.0/tests/unit/streaming/support}/__init__.py +0 -0
  752. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/support/flow_cases.py +0 -0
  753. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/test_fork.py +0 -0
  754. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/test_otel_observability.py +0 -0
  755. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/test_routing.py +0 -0
  756. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/streaming/test_with.py +0 -0
  757. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/testing/test_golden.py +0 -0
  758. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/testing/test_http_harness.py +0 -0
  759. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/testing/test_in_memory.py +0 -0
  760. {loom_kernel-0.7.0 → loom_kernel-0.8.0}/tests/unit/testing/test_runner.py +0 -0
@@ -87,7 +87,7 @@ jobs:
87
87
  sed -i "0,/^version = \".*\"/s//version = \"${VERSION}\"/" pyproject.toml
88
88
  sed -i "/^\[tool.commitizen\]/,/^\[/ s/^version = \".*\"/version = \"${VERSION}\"/" pyproject.toml
89
89
 
90
- - name: Open version bump PR
90
+ - name: Create or merge version bump PR
91
91
  if: ${{ steps.version.outputs.deploy == 'true' }}
92
92
  env:
93
93
  VERSION: ${{ steps.version.outputs.version }}
@@ -99,22 +99,36 @@ jobs:
99
99
  git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
100
100
 
101
101
  BRANCH="docs/release-v${VERSION}"
102
- git checkout -B "${BRANCH}"
103
102
 
104
- if [ -f CHANGELOG_RELEASE.md ]; then
105
- HEADER=$(head -1 CHANGELOG_RELEASE.md)
106
- if ! grep -qF "${HEADER}" CHANGELOG.md; then
107
- cat CHANGELOG_RELEASE.md CHANGELOG.md > CHANGELOG_MERGED.md
108
- mv CHANGELOG_MERGED.md CHANGELOG.md
109
- fi
103
+ if git ls-remote --tags origin "refs/tags/v${VERSION}" | grep -q .; then
104
+ echo "Release tag v${VERSION} already exists; skipping version bump PR."
105
+ exit 0
106
+ fi
107
+
108
+ open_pr_count=$(gh pr list --head "${BRANCH}" --state open --json number --jq 'length')
109
+ all_pr_count=$(gh pr list --head "${BRANCH}" --state all --json number --jq 'length')
110
+
111
+ if [ "${all_pr_count}" -gt 0 ] && [ "${open_pr_count}" -eq 0 ]; then
112
+ echo "Release PR ${BRANCH} already exists in a closed state; skipping duplicate creation."
113
+ exit 0
110
114
  fi
111
115
 
112
- git add pyproject.toml CHANGELOG.md
113
- git diff --staged --quiet && exit 0
114
- git commit -m "chore(release): bump version to ${VERSION}"
115
- git push origin "${BRANCH}" --force
116
+ if [ "${open_pr_count}" -eq 0 ]; then
117
+ git checkout -B "${BRANCH}"
118
+
119
+ if [ -f CHANGELOG_RELEASE.md ]; then
120
+ HEADER=$(head -1 CHANGELOG_RELEASE.md)
121
+ if ! grep -qF "${HEADER}" CHANGELOG.md; then
122
+ cat CHANGELOG_RELEASE.md CHANGELOG.md > CHANGELOG_MERGED.md
123
+ mv CHANGELOG_MERGED.md CHANGELOG.md
124
+ fi
125
+ fi
126
+
127
+ git add pyproject.toml CHANGELOG.md
128
+ git diff --staged --quiet && exit 0
129
+ git commit -m "chore(release): bump version to ${VERSION}"
130
+ git push origin "${BRANCH}" --force
116
131
 
117
- if ! gh pr list --head "${BRANCH}" --state open --json number --jq '.[0].number' | grep -qE '^[0-9]+$'; then
118
132
  gh pr create \
119
133
  --title "chore(release): bump version to ${VERSION}" \
120
134
  --body "Automated version bump and changelog update after release v${VERSION}." \
@@ -136,10 +150,13 @@ jobs:
136
150
  uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1
137
151
  with:
138
152
  password: ${{ env.PYPI_API_TOKEN }}
153
+ skip-existing: true
139
154
 
140
155
  - name: Publish package to PyPI (trusted publisher)
141
156
  if: ${{ steps.version.outputs.deploy == 'true' && env.PYPI_API_TOKEN == '' }}
142
157
  uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1
158
+ with:
159
+ skip-existing: true
143
160
 
144
161
  - name: Create and push tags
145
162
  if: ${{ steps.version.outputs.deploy == 'true' }}
@@ -1,3 +1,112 @@
1
+ # 🚀 Release 0.8.0 ([#30](https://github.com/the-reacher-data/loom-py/pull/30)) ([`702b99e`](https://github.com/the-reacher-data/loom-py/commit/702b99ec75a4130f273322f8eb488637a2f98a14))
2
+
3
+
4
+ ## ✨ Features
5
+ ### streaming
6
+ - **streaming:** add IntoSink/SinkPartition protocols and Decompose node<br>
7
+ > Introduces the two-level contract that makes storage sinks extensible at
8
+ > the node level. Any frozen dataclass satisfying IntoSink is a first-class
9
+ > terminal node — no registration, no inheritance, no framework coupling.
10
+ > core/schema/: new shared module; SchemaMode promoted from ETL (ETL re-exports for backwards compat)
11
+ > nodes/_sink.py: SinkPartition (contravariant per-worker protocol) and IntoSink (runtime-checkable terminal protocol)
12
+ > nodes/_decompose.py: EntityDecomposer protocol and Decompose transformation node
13
+ > validate.py: _is_leaf_terminal() helper unifies all terminal checks; IntoSink recognised as terminal in shape and output validation; _node_output_shape refactored to dispatch map
14
+ > exports: IntoSink, SinkPartition, Decompose, EntityDecomposer in public API
15
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
16
+
17
+ - **streaming:** add IntoTable sink node and rename EntityDecomposer to PayloadExpander<br>
18
+ > IntoTable: frozen dataclass implementing IntoSink for SQLAlchemy and Delta backends
19
+ > Backend enum: SQLALCHEMY and DELTA variants
20
+ > _SQLAlchemyTablePartition: bulk-insert via engine.begin() per epoch batch
21
+ > _DeltaTablePartition: write via deltalake + polars with validated write mode
22
+ > Rename EntityDecomposer -> PayloadExpander, decompose() -> expand(), targets -> outputs
23
+ > Update both streaming.__init__ and streaming.nodes.__init__ public exports
24
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
25
+
26
+
27
+ ### streaming/compiler
28
+ - **streaming/compiler:** teach compiler to resolve IntoSink nodes<br>
29
+ > Add CompiledStorageSink to _plan: holds the IntoSink node and its
30
+ > pre-fetched streaming.sinks.<name> config section
31
+ > Add terminal_storage_sinks field to CompiledPlan (default empty dict
32
+ > keeps all existing tests green)
33
+ > Refactor _build_terminal_sinks and all branch builders to return
34
+ > (kafka_sinks, storage_sinks) tuple in a single walk — no duplicate
35
+ > traversal
36
+ > Add _build_storage_sink: resolves config by node.name or passes {}
37
+ > when name is empty (self-configured sinks)
38
+ > Add validate_storage_sinks phase: reports a clear error for every
39
+ > named IntoSink whose streaming.sinks.<name> section is absent
40
+ > Wire validate_storage_sinks into the compiler pipeline
41
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42
+
43
+ - **streaming/compiler:** add Decompose shape and structural validation<br>
44
+ > Import Decompose in validate.py
45
+ > Add RECORD to _node_input_shape for Decompose — enforces that it
46
+ > receives individual events, not batches
47
+ > Add Decompose: StreamShape.RECORD to _FIXED_OUTPUT_SHAPES — its
48
+ > output feeds the Router as per-type records
49
+ > Add structural check in _validate_shape_sequence: Decompose must be
50
+ > immediately followed by a Router; clear error message when it is not
51
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52
+
53
+
54
+ ### streaming/bytewax
55
+ - **streaming/bytewax:** wire IntoSink nodes to Bytewax output operators<br>
56
+ > Add handlers/storage.py: _StorageSinkPartition wraps loom SinkPartition,
57
+ > extracting payload from Message envelopes; _StorageDynamicSink calls
58
+ > node.build_partition(config, worker_index, worker_count) once per
59
+ > Bytewax worker at startup; _apply_into_sink registers the DynamicSink
60
+ > via bw_output for any IntoSink node found in the compiled plan
61
+ > Register IntoSink in _NODE_HANDLERS dispatch map (dispatcher.py) so
62
+ > _wire_process routes any IntoSink node to _apply_into_sink
63
+ > Add IntoSink pass-through in _execute_router_node (routing.py)
64
+ > consistent with the IntoTopic/Drain pattern for inline Router execution
65
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66
+
67
+
68
+
69
+
70
+
71
+
72
+ ## ♻️ Refactor
73
+ ### streaming
74
+ - **streaming:** improve _SQLAlchemyTablePartition with typed columns and pool config<br>
75
+ > Extract _require_sa_url, _sa_engine_kwargs, _sa_type_for, _sa_table_from_struct,
76
+ > _structs_to_rows helpers for readability and single responsibility
77
+ > Map Python types to SA column types (_sa_type_for) with Optional unwrapping
78
+ > and collection → JSON fallback; mirrors _SCALAR_TYPE_MAP from introspection.py
79
+ > Mirror SessionManager pool defaults: pool_pre_ping, echo, pool_size,
80
+ > max_overflow, pool_timeout, pool_recycle, connect_args from config
81
+ > Replace msgspec.structs.asdict cast hack with direct call via _structs_to_rows
82
+ > Drop connection_string fallback — config contract is url only
83
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
84
+
85
+ - **streaming:** merge sink config from dsl and yaml
86
+ - **streaming:** move table sink into package
87
+ - **streaming:** resolve table sink config via context
88
+ - **streaming:** enforce typed table sink config
89
+
90
+
91
+
92
+ ## ✅ Tests
93
+ ### streaming
94
+ - **streaming:** add IntoTable SQLAlchemy integration tests against SQLite<br>
95
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
96
+
97
+ - **streaming:** cover resource manager session cache
98
+
99
+
100
+
101
+ ## 🔖 Other
102
+ - Fix Bytewax step flat_map tests
103
+ - Refactor streaming validation helpers<br>
104
+ > --------
105
+ > Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
106
+
107
+
108
+
109
+
1
110
  # 🚀 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
111
 
3
112
 
@@ -0,0 +1,107 @@
1
+ # 🚀 Release 0.8.0 ([#30](https://github.com/the-reacher-data/loom-py/pull/30)) ([`702b99e`](https://github.com/the-reacher-data/loom-py/commit/702b99ec75a4130f273322f8eb488637a2f98a14))
2
+
3
+
4
+ ## ✨ Features
5
+ ### streaming
6
+ - **streaming:** add IntoSink/SinkPartition protocols and Decompose node<br>
7
+ > Introduces the two-level contract that makes storage sinks extensible at
8
+ > the node level. Any frozen dataclass satisfying IntoSink is a first-class
9
+ > terminal node — no registration, no inheritance, no framework coupling.
10
+ > core/schema/: new shared module; SchemaMode promoted from ETL (ETL re-exports for backwards compat)
11
+ > nodes/_sink.py: SinkPartition (contravariant per-worker protocol) and IntoSink (runtime-checkable terminal protocol)
12
+ > nodes/_decompose.py: EntityDecomposer protocol and Decompose transformation node
13
+ > validate.py: _is_leaf_terminal() helper unifies all terminal checks; IntoSink recognised as terminal in shape and output validation; _node_output_shape refactored to dispatch map
14
+ > exports: IntoSink, SinkPartition, Decompose, EntityDecomposer in public API
15
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
16
+
17
+ - **streaming:** add IntoTable sink node and rename EntityDecomposer to PayloadExpander<br>
18
+ > IntoTable: frozen dataclass implementing IntoSink for SQLAlchemy and Delta backends
19
+ > Backend enum: SQLALCHEMY and DELTA variants
20
+ > _SQLAlchemyTablePartition: bulk-insert via engine.begin() per epoch batch
21
+ > _DeltaTablePartition: write via deltalake + polars with validated write mode
22
+ > Rename EntityDecomposer -> PayloadExpander, decompose() -> expand(), targets -> outputs
23
+ > Update both streaming.__init__ and streaming.nodes.__init__ public exports
24
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
25
+
26
+
27
+ ### streaming/compiler
28
+ - **streaming/compiler:** teach compiler to resolve IntoSink nodes<br>
29
+ > Add CompiledStorageSink to _plan: holds the IntoSink node and its
30
+ > pre-fetched streaming.sinks.<name> config section
31
+ > Add terminal_storage_sinks field to CompiledPlan (default empty dict
32
+ > keeps all existing tests green)
33
+ > Refactor _build_terminal_sinks and all branch builders to return
34
+ > (kafka_sinks, storage_sinks) tuple in a single walk — no duplicate
35
+ > traversal
36
+ > Add _build_storage_sink: resolves config by node.name or passes {}
37
+ > when name is empty (self-configured sinks)
38
+ > Add validate_storage_sinks phase: reports a clear error for every
39
+ > named IntoSink whose streaming.sinks.<name> section is absent
40
+ > Wire validate_storage_sinks into the compiler pipeline
41
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42
+
43
+ - **streaming/compiler:** add Decompose shape and structural validation<br>
44
+ > Import Decompose in validate.py
45
+ > Add RECORD to _node_input_shape for Decompose — enforces that it
46
+ > receives individual events, not batches
47
+ > Add Decompose: StreamShape.RECORD to _FIXED_OUTPUT_SHAPES — its
48
+ > output feeds the Router as per-type records
49
+ > Add structural check in _validate_shape_sequence: Decompose must be
50
+ > immediately followed by a Router; clear error message when it is not
51
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52
+
53
+
54
+ ### streaming/bytewax
55
+ - **streaming/bytewax:** wire IntoSink nodes to Bytewax output operators<br>
56
+ > Add handlers/storage.py: _StorageSinkPartition wraps loom SinkPartition,
57
+ > extracting payload from Message envelopes; _StorageDynamicSink calls
58
+ > node.build_partition(config, worker_index, worker_count) once per
59
+ > Bytewax worker at startup; _apply_into_sink registers the DynamicSink
60
+ > via bw_output for any IntoSink node found in the compiled plan
61
+ > Register IntoSink in _NODE_HANDLERS dispatch map (dispatcher.py) so
62
+ > _wire_process routes any IntoSink node to _apply_into_sink
63
+ > Add IntoSink pass-through in _execute_router_node (routing.py)
64
+ > consistent with the IntoTopic/Drain pattern for inline Router execution
65
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
66
+
67
+
68
+
69
+
70
+
71
+
72
+ ## ♻️ Refactor
73
+ ### streaming
74
+ - **streaming:** improve _SQLAlchemyTablePartition with typed columns and pool config<br>
75
+ > Extract _require_sa_url, _sa_engine_kwargs, _sa_type_for, _sa_table_from_struct,
76
+ > _structs_to_rows helpers for readability and single responsibility
77
+ > Map Python types to SA column types (_sa_type_for) with Optional unwrapping
78
+ > and collection → JSON fallback; mirrors _SCALAR_TYPE_MAP from introspection.py
79
+ > Mirror SessionManager pool defaults: pool_pre_ping, echo, pool_size,
80
+ > max_overflow, pool_timeout, pool_recycle, connect_args from config
81
+ > Replace msgspec.structs.asdict cast hack with direct call via _structs_to_rows
82
+ > Drop connection_string fallback — config contract is url only
83
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
84
+
85
+ - **streaming:** merge sink config from dsl and yaml
86
+ - **streaming:** move table sink into package
87
+ - **streaming:** resolve table sink config via context
88
+ - **streaming:** enforce typed table sink config
89
+
90
+
91
+
92
+ ## ✅ Tests
93
+ ### streaming
94
+ - **streaming:** add IntoTable SQLAlchemy integration tests against SQLite<br>
95
+ > Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
96
+
97
+ - **streaming:** cover resource manager session cache
98
+
99
+
100
+
101
+ ## 🔖 Other
102
+ - Fix Bytewax step flat_map tests
103
+ - Refactor streaming validation helpers<br>
104
+ > --------
105
+ > Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
106
+
107
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loom-kernel
3
- Version: 0.7.0
3
+ Version: 0.8.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.7.0"
3
+ version = "0.8.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.7.0"
223
+ version = "0.8.0"
224
224
  tag_format = "v$version"
225
225
  version_files = [
226
226
  "pyproject.toml:project.version",
@@ -1,6 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
- from collections.abc import AsyncIterator
3
+ from collections.abc import AsyncIterator, Mapping
4
4
  from contextlib import asynccontextmanager
5
5
  from typing import Any
6
6
 
@@ -19,6 +19,46 @@ from loom.core.tracing import get_trace_id
19
19
  class SessionManager:
20
20
  """Async SQLAlchemy session manager with pooling support."""
21
21
 
22
+ @classmethod
23
+ def from_config(
24
+ cls,
25
+ config: Mapping[str, Any],
26
+ *,
27
+ inject_trace_id: bool = True,
28
+ **engine_kwargs: object,
29
+ ) -> SessionManager:
30
+ """Build a session manager from a resolved SQLAlchemy config mapping.
31
+
32
+ Args:
33
+ config: Resolved config mapping containing a ``url`` entry and
34
+ optional pool tuning keys.
35
+ inject_trace_id: When ``True``, prefixes SQL statements with the
36
+ active trace id when available.
37
+ **engine_kwargs: Additional keyword arguments forwarded to the
38
+ async engine constructor.
39
+
40
+ Returns:
41
+ A configured :class:`SessionManager`.
42
+
43
+ Raises:
44
+ ValueError: If ``url`` is missing or empty.
45
+ """
46
+ url = config.get("url")
47
+ if not url:
48
+ raise ValueError("SQLAlchemy sink config requires a 'url'.")
49
+ return cls(
50
+ str(url),
51
+ echo=bool(config.get("echo", False)),
52
+ pool_pre_ping=bool(config.get("pool_pre_ping", True)),
53
+ pool_size=_optional_int(config.get("pool_size"), 10),
54
+ max_overflow=_optional_int(config.get("max_overflow"), 20),
55
+ pool_timeout=_optional_int(config.get("pool_timeout"), 30),
56
+ pool_recycle=_optional_int(config.get("pool_recycle"), 1800),
57
+ connect_args=dict(config.get("connect_args") or {}),
58
+ inject_trace_id=inject_trace_id,
59
+ **engine_kwargs,
60
+ )
61
+
22
62
  def __init__(
23
63
  self,
24
64
  url: str,
@@ -139,3 +179,9 @@ def _register_trace_id_listener(async_engine: AsyncEngine) -> None:
139
179
  if tid:
140
180
  statement = f"/* trace_id={tid} */ " + statement
141
181
  return statement, parameters
182
+
183
+
184
+ def _optional_int(value: Any, default: int) -> int:
185
+ if value is None:
186
+ return default
187
+ return int(value)
@@ -0,0 +1,5 @@
1
+ """Shared schema primitives promoted from ETL for use across all loom layers."""
2
+
3
+ from loom.core.schema.schema_mode import SchemaMode
4
+
5
+ __all__ = ["SchemaMode"]
@@ -0,0 +1,22 @@
1
+ """Schema evolution mode shared by ETL and streaming layers."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from enum import StrEnum
6
+
7
+
8
+ class SchemaMode(StrEnum):
9
+ """Schema evolution strategy applied before each write to a storage target.
10
+
11
+ Values:
12
+ STRICT: Fail on incompatible schema changes.
13
+ EVOLVE: Allow additive evolution where the backend supports it.
14
+ OVERWRITE: Replace the table schema with the incoming schema.
15
+ """
16
+
17
+ STRICT = "strict"
18
+ EVOLVE = "evolve"
19
+ OVERWRITE = "overwrite"
20
+
21
+
22
+ __all__ = ["SchemaMode"]
@@ -0,0 +1,5 @@
1
+ """Schema evolution mode — re-exported from loom.core.schema for backwards compatibility."""
2
+
3
+ from loom.core.schema.schema_mode import SchemaMode
4
+
5
+ __all__ = ["SchemaMode"]
@@ -31,10 +31,12 @@ from loom.streaming.nodes._boundary import (
31
31
  PartitionStrategy,
32
32
  )
33
33
  from loom.streaming.nodes._broadcast import Broadcast, BroadcastRoute
34
+ from loom.streaming.nodes._decompose import Explode, PayloadExpander
34
35
  from loom.streaming.nodes._fork import Fork, ForkRoute
35
36
  from loom.streaming.nodes._protocols import Predicate, Selector
36
37
  from loom.streaming.nodes._router import Route, Router
37
38
  from loom.streaming.nodes._shape import CollectBatch, Drain, ForEach, StreamShape, WindowStrategy
39
+ from loom.streaming.nodes._sink import IntoSink, SinkPartition
38
40
  from loom.streaming.nodes._step import (
39
41
  BatchExpandStep,
40
42
  BatchStep,
@@ -44,6 +46,13 @@ from loom.streaming.nodes._step import (
44
46
  Step,
45
47
  StepContext,
46
48
  )
49
+ from loom.streaming.nodes._table import (
50
+ Backend,
51
+ DeltaSinkConfig,
52
+ IntoTable,
53
+ SqlAlchemyDatabaseConfig,
54
+ SqlAlchemySinkConfig,
55
+ )
47
56
  from loom.streaming.nodes._with import (
48
57
  AsyncContextDependency,
49
58
  ContextFactory,
@@ -57,45 +66,54 @@ from loom.streaming.nodes.refs import payload as payload
57
66
 
58
67
  __all__ = [
59
68
  "AsyncContextDependency",
69
+ "Backend",
60
70
  "BatchExpandStep",
61
71
  "BatchStep",
62
72
  "Broadcast",
63
73
  "BroadcastRoute",
64
74
  "CollectBatch",
65
75
  "ContextFactory",
76
+ "DeltaSinkConfig",
77
+ "Explode",
66
78
  "Drain",
79
+ "PayloadExpander",
67
80
  "ErrorEnvelope",
68
81
  "ErrorKind",
69
82
  "ErrorMessage",
70
83
  "ErrorMessageMeta",
71
84
  "ErrorRoute",
85
+ "ExpandStep",
72
86
  "ForEach",
73
- "FromMultiTypeTopic",
74
- "FromTopic",
75
87
  "Fork",
76
88
  "ForkRoute",
77
- "ExpandStep",
89
+ "FromMultiTypeTopic",
90
+ "FromTopic",
91
+ "IntoSink",
92
+ "IntoTable",
78
93
  "IntoTopic",
79
94
  "Message",
80
95
  "MessageMeta",
81
96
  "PartitionGuarantee",
82
97
  "PartitionPolicy",
83
98
  "PartitionStrategy",
99
+ "Predicate",
84
100
  "Process",
85
101
  "ProcessNode",
86
- "Predicate",
87
102
  "RecordStep",
88
103
  "ResourceFactory",
89
104
  "ResourceScope",
90
105
  "Route",
91
106
  "Router",
92
107
  "Selector",
108
+ "SinkPartition",
93
109
  "StreamFlow",
94
110
  "StreamShape",
95
- "WindowStrategy",
96
111
  "Step",
97
112
  "StepContext",
98
113
  "SyncContextDependency",
114
+ "SqlAlchemyDatabaseConfig",
115
+ "SqlAlchemySinkConfig",
116
+ "WindowStrategy",
99
117
  "With",
100
118
  "WithAsync",
101
119
  "compile_flow",
@@ -287,6 +287,10 @@ class _BuildContext:
287
287
  """Get or create a resource manager for *node* at position *idx*."""
288
288
  return self.resource_manager.manager_for(idx, node)
289
289
 
290
+ def session_manager_for(self, config: Any) -> Any:
291
+ """Get or create a shared SQLAlchemy session manager for one config."""
292
+ return self.resource_manager.session_manager_for(config)
293
+
290
294
  @property
291
295
  def current_path(self) -> tuple[int, ...]:
292
296
  """Return the current wiring path inside the process tree."""