etlantic 0.10.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 (254) hide show
  1. etlantic-0.10.0/.gitignore +24 -0
  2. etlantic-0.10.0/CHANGELOG.md +382 -0
  3. etlantic-0.10.0/LICENSE +21 -0
  4. etlantic-0.10.0/PKG-INFO +235 -0
  5. etlantic-0.10.0/README.md +174 -0
  6. etlantic-0.10.0/SECURITY.md +62 -0
  7. etlantic-0.10.0/examples/README.md +70 -0
  8. etlantic-0.10.0/examples/airflow_compile.py +107 -0
  9. etlantic-0.10.0/examples/dataframe_parity.py +87 -0
  10. etlantic-0.10.0/examples/file_storage.py +98 -0
  11. etlantic-0.10.0/examples/pyspark_local.py +75 -0
  12. etlantic-0.10.0/examples/quickstart.py +73 -0
  13. etlantic-0.10.0/examples/sql_boundary_hybrid.py +93 -0
  14. etlantic-0.10.0/examples/sql_failure_recovery.py +79 -0
  15. etlantic-0.10.0/examples/sql_to_sql.py +119 -0
  16. etlantic-0.10.0/examples/sql_transactional_write.py +83 -0
  17. etlantic-0.10.0/packages/etlantic-airflow/README.md +37 -0
  18. etlantic-0.10.0/packages/etlantic-airflow/pyproject.toml +38 -0
  19. etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/__init__.py +16 -0
  20. etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/loader.py +50 -0
  21. etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/operator.py +58 -0
  22. etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/plugin.py +251 -0
  23. etlantic-0.10.0/packages/etlantic-keyring/README.md +33 -0
  24. etlantic-0.10.0/packages/etlantic-keyring/pyproject.toml +36 -0
  25. etlantic-0.10.0/packages/etlantic-keyring/src/etlantic_keyring/__init__.py +93 -0
  26. etlantic-0.10.0/packages/etlantic-pandas/README.md +11 -0
  27. etlantic-0.10.0/packages/etlantic-pandas/pyproject.toml +42 -0
  28. etlantic-0.10.0/packages/etlantic-pandas/src/etlantic_pandas/__init__.py +267 -0
  29. etlantic-0.10.0/packages/etlantic-polars/README.md +12 -0
  30. etlantic-0.10.0/packages/etlantic-polars/pyproject.toml +42 -0
  31. etlantic-0.10.0/packages/etlantic-polars/src/etlantic_polars/__init__.py +342 -0
  32. etlantic-0.10.0/packages/etlantic-pyspark/README.md +34 -0
  33. etlantic-0.10.0/packages/etlantic-pyspark/pyproject.toml +45 -0
  34. etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/__init__.py +16 -0
  35. etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/plugin.py +449 -0
  36. etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/provider.py +155 -0
  37. etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/sparkless_shim.py +65 -0
  38. etlantic-0.10.0/packages/etlantic-sparkforge/README.md +88 -0
  39. etlantic-0.10.0/packages/etlantic-sparkforge/pyproject.toml +38 -0
  40. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/__init__.py +61 -0
  41. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/adapt.py +573 -0
  42. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/compat.py +155 -0
  43. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/ir.py +197 -0
  44. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/reports.py +341 -0
  45. etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/runtime_map.py +104 -0
  46. etlantic-0.10.0/packages/etlantic-sql/README.md +43 -0
  47. etlantic-0.10.0/packages/etlantic-sql/pyproject.toml +43 -0
  48. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/__init__.py +9 -0
  49. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/catalog.py +54 -0
  50. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/compiler.py +190 -0
  51. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/dialect_postgresql.py +26 -0
  52. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/executor.py +344 -0
  53. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/plugin.py +247 -0
  54. etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/writes.py +19 -0
  55. etlantic-0.10.0/packages/etlantic-sqlmodel/README.md +45 -0
  56. etlantic-0.10.0/packages/etlantic-sqlmodel/pyproject.toml +36 -0
  57. etlantic-0.10.0/packages/etlantic-sqlmodel/src/etlantic_sqlmodel/__init__.py +351 -0
  58. etlantic-0.10.0/pyproject.toml +223 -0
  59. etlantic-0.10.0/src/etlantic/__init__.py +299 -0
  60. etlantic-0.10.0/src/etlantic/_version.py +1 -0
  61. etlantic-0.10.0/src/etlantic/agents.py +146 -0
  62. etlantic-0.10.0/src/etlantic/capabilities.py +293 -0
  63. etlantic-0.10.0/src/etlantic/cli/__init__.py +427 -0
  64. etlantic-0.10.0/src/etlantic/cli/__main__.py +6 -0
  65. etlantic-0.10.0/src/etlantic/cli/commands.py +655 -0
  66. etlantic-0.10.0/src/etlantic/contracts.py +73 -0
  67. etlantic-0.10.0/src/etlantic/dataframe/__init__.py +54 -0
  68. etlantic-0.10.0/src/etlantic/dataframe/arrow.py +91 -0
  69. etlantic-0.10.0/src/etlantic/dataframe/discovery.py +80 -0
  70. etlantic-0.10.0/src/etlantic/dataframe/helpers.py +125 -0
  71. etlantic-0.10.0/src/etlantic/dataframe/protocol.py +265 -0
  72. etlantic-0.10.0/src/etlantic/diagnostics/__init__.py +140 -0
  73. etlantic-0.10.0/src/etlantic/diagnostics/github.py +27 -0
  74. etlantic-0.10.0/src/etlantic/diagnostics/sarif.py +66 -0
  75. etlantic-0.10.0/src/etlantic/exceptions.py +91 -0
  76. etlantic-0.10.0/src/etlantic/ide/__init__.py +162 -0
  77. etlantic-0.10.0/src/etlantic/identity.py +93 -0
  78. etlantic-0.10.0/src/etlantic/inspection.py +18 -0
  79. etlantic-0.10.0/src/etlantic/interchange/__init__.py +50 -0
  80. etlantic-0.10.0/src/etlantic/interchange/bundle.py +333 -0
  81. etlantic-0.10.0/src/etlantic/interchange/diagnostics.py +74 -0
  82. etlantic-0.10.0/src/etlantic/interchange/diff.py +249 -0
  83. etlantic-0.10.0/src/etlantic/interchange/dpcs.py +649 -0
  84. etlantic-0.10.0/src/etlantic/interchange/dtcs.py +403 -0
  85. etlantic-0.10.0/src/etlantic/interchange/normalize.py +29 -0
  86. etlantic-0.10.0/src/etlantic/interchange/odcs.py +180 -0
  87. etlantic-0.10.0/src/etlantic/interchange/policy.py +148 -0
  88. etlantic-0.10.0/src/etlantic/interchange/provenance.py +25 -0
  89. etlantic-0.10.0/src/etlantic/interchange/security.py +105 -0
  90. etlantic-0.10.0/src/etlantic/lifecycle/__init__.py +25 -0
  91. etlantic-0.10.0/src/etlantic/lifecycle/callbacks.py +57 -0
  92. etlantic-0.10.0/src/etlantic/lifecycle/lifespan.py +26 -0
  93. etlantic-0.10.0/src/etlantic/lifecycle/middleware.py +39 -0
  94. etlantic-0.10.0/src/etlantic/lifecycle/outbound.py +26 -0
  95. etlantic-0.10.0/src/etlantic/lifecycle/resources.py +93 -0
  96. etlantic-0.10.0/src/etlantic/lifecycle/runtime.py +239 -0
  97. etlantic-0.10.0/src/etlantic/mermaid.py +44 -0
  98. etlantic-0.10.0/src/etlantic/model.py +106 -0
  99. etlantic-0.10.0/src/etlantic/notebook.py +130 -0
  100. etlantic-0.10.0/src/etlantic/observability.py +90 -0
  101. etlantic-0.10.0/src/etlantic/orchestration/__init__.py +99 -0
  102. etlantic-0.10.0/src/etlantic/orchestration/artifacts.py +114 -0
  103. etlantic-0.10.0/src/etlantic/orchestration/compile.py +138 -0
  104. etlantic-0.10.0/src/etlantic/orchestration/discovery.py +73 -0
  105. etlantic-0.10.0/src/etlantic/orchestration/lifecycle.py +223 -0
  106. etlantic-0.10.0/src/etlantic/orchestration/mapping.py +146 -0
  107. etlantic-0.10.0/src/etlantic/orchestration/protocol.py +289 -0
  108. etlantic-0.10.0/src/etlantic/orchestration/reliability.py +181 -0
  109. etlantic-0.10.0/src/etlantic/pipeline.py +859 -0
  110. etlantic-0.10.0/src/etlantic/plan/__init__.py +34 -0
  111. etlantic-0.10.0/src/etlantic/plan/artifacts.py +77 -0
  112. etlantic-0.10.0/src/etlantic/plan/explain.py +87 -0
  113. etlantic-0.10.0/src/etlantic/plan/model.py +333 -0
  114. etlantic-0.10.0/src/etlantic/plan/planner.py +1085 -0
  115. etlantic-0.10.0/src/etlantic/plan/regions.py +73 -0
  116. etlantic-0.10.0/src/etlantic/plan/serialize.py +73 -0
  117. etlantic-0.10.0/src/etlantic/plan/slicing.py +81 -0
  118. etlantic-0.10.0/src/etlantic/plugin_trust.py +123 -0
  119. etlantic-0.10.0/src/etlantic/policy.py +88 -0
  120. etlantic-0.10.0/src/etlantic/ports.py +111 -0
  121. etlantic-0.10.0/src/etlantic/profile.py +192 -0
  122. etlantic-0.10.0/src/etlantic/py.typed +0 -0
  123. etlantic-0.10.0/src/etlantic/refs.py +65 -0
  124. etlantic-0.10.0/src/etlantic/registry.py +270 -0
  125. etlantic-0.10.0/src/etlantic/reliability.py +277 -0
  126. etlantic-0.10.0/src/etlantic/reliability_providers.py +169 -0
  127. etlantic-0.10.0/src/etlantic/reliability_runtime.py +187 -0
  128. etlantic-0.10.0/src/etlantic/reports/__init__.py +36 -0
  129. etlantic-0.10.0/src/etlantic/reports/file_store.py +71 -0
  130. etlantic-0.10.0/src/etlantic/reports/model.py +315 -0
  131. etlantic-0.10.0/src/etlantic/reports/render.py +77 -0
  132. etlantic-0.10.0/src/etlantic/reports/store.py +38 -0
  133. etlantic-0.10.0/src/etlantic/runtime/__init__.py +47 -0
  134. etlantic-0.10.0/src/etlantic/runtime/artifacts.py +116 -0
  135. etlantic-0.10.0/src/etlantic/runtime/breakpoints.py +54 -0
  136. etlantic-0.10.0/src/etlantic/runtime/context.py +38 -0
  137. etlantic-0.10.0/src/etlantic/runtime/dataframe_exec.py +328 -0
  138. etlantic-0.10.0/src/etlantic/runtime/events.py +85 -0
  139. etlantic-0.10.0/src/etlantic/runtime/execute.py +272 -0
  140. etlantic-0.10.0/src/etlantic/runtime/invoke.py +23 -0
  141. etlantic-0.10.0/src/etlantic/runtime/logging.py +132 -0
  142. etlantic-0.10.0/src/etlantic/runtime/orchestrator.py +2049 -0
  143. etlantic-0.10.0/src/etlantic/runtime/request.py +265 -0
  144. etlantic-0.10.0/src/etlantic/runtime/spark_exec.py +427 -0
  145. etlantic-0.10.0/src/etlantic/runtime/sql_exec.py +298 -0
  146. etlantic-0.10.0/src/etlantic/runtime/state.py +46 -0
  147. etlantic-0.10.0/src/etlantic/schema_drift.py +365 -0
  148. etlantic-0.10.0/src/etlantic/schema_history.py +137 -0
  149. etlantic-0.10.0/src/etlantic/schema_policy.py +151 -0
  150. etlantic-0.10.0/src/etlantic/schemas/__init__.py +32 -0
  151. etlantic-0.10.0/src/etlantic/schemas/pipeline-plan.schema.json +40 -0
  152. etlantic-0.10.0/src/etlantic/schemas/pipeline-run-report.schema.json +40 -0
  153. etlantic-0.10.0/src/etlantic/schemas/profile.schema.json +46 -0
  154. etlantic-0.10.0/src/etlantic/schemas/project-config.schema.json +16 -0
  155. etlantic-0.10.0/src/etlantic/secrets/__init__.py +30 -0
  156. etlantic-0.10.0/src/etlantic/secrets/cache.py +81 -0
  157. etlantic-0.10.0/src/etlantic/secrets/env.py +66 -0
  158. etlantic-0.10.0/src/etlantic/secrets/file.py +84 -0
  159. etlantic-0.10.0/src/etlantic/secrets/provider.py +89 -0
  160. etlantic-0.10.0/src/etlantic/secrets/ref.py +40 -0
  161. etlantic-0.10.0/src/etlantic/secrets/value.py +56 -0
  162. etlantic-0.10.0/src/etlantic/spark/__init__.py +111 -0
  163. etlantic-0.10.0/src/etlantic/spark/discovery.py +106 -0
  164. etlantic-0.10.0/src/etlantic/spark/protocol.py +420 -0
  165. etlantic-0.10.0/src/etlantic/spark/provider.py +134 -0
  166. etlantic-0.10.0/src/etlantic/spark/schema.py +283 -0
  167. etlantic-0.10.0/src/etlantic/spark/streaming.py +100 -0
  168. etlantic-0.10.0/src/etlantic/sql/__init__.py +89 -0
  169. etlantic-0.10.0/src/etlantic/sql/discovery.py +71 -0
  170. etlantic-0.10.0/src/etlantic/sql/expression.py +66 -0
  171. etlantic-0.10.0/src/etlantic/sql/helpers.py +51 -0
  172. etlantic-0.10.0/src/etlantic/sql/protocol.py +489 -0
  173. etlantic-0.10.0/src/etlantic/sql/write.py +75 -0
  174. etlantic-0.10.0/src/etlantic/storage/__init__.py +21 -0
  175. etlantic-0.10.0/src/etlantic/storage/callable_binding.py +67 -0
  176. etlantic-0.10.0/src/etlantic/storage/csv_binding.py +88 -0
  177. etlantic-0.10.0/src/etlantic/storage/json_binding.py +73 -0
  178. etlantic-0.10.0/src/etlantic/storage/memory.py +54 -0
  179. etlantic-0.10.0/src/etlantic/storage/null.py +40 -0
  180. etlantic-0.10.0/src/etlantic/storage/protocol.py +68 -0
  181. etlantic-0.10.0/src/etlantic/symbols.py +117 -0
  182. etlantic-0.10.0/src/etlantic/testing/__init__.py +38 -0
  183. etlantic-0.10.0/src/etlantic/testing/dataframe.py +111 -0
  184. etlantic-0.10.0/src/etlantic/testing/orchestrator.py +49 -0
  185. etlantic-0.10.0/src/etlantic/testing/secrets.py +89 -0
  186. etlantic-0.10.0/src/etlantic/testing/sql.py +56 -0
  187. etlantic-0.10.0/src/etlantic/testing/write_semantics.py +64 -0
  188. etlantic-0.10.0/src/etlantic/transformation.py +324 -0
  189. etlantic-0.10.0/src/etlantic/validation.py +786 -0
  190. etlantic-0.10.0/src/etlantic/viz.py +197 -0
  191. etlantic-0.10.0/tests/__init__.py +0 -0
  192. etlantic-0.10.0/tests/airflow/test_airflow_compile.py +181 -0
  193. etlantic-0.10.0/tests/cli/__init__.py +0 -0
  194. etlantic-0.10.0/tests/cli/test_cli.py +101 -0
  195. etlantic-0.10.0/tests/conftest.py +31 -0
  196. etlantic-0.10.0/tests/dataframe/test_conformance.py +31 -0
  197. etlantic-0.10.0/tests/dataframe/test_correctness.py +272 -0
  198. etlantic-0.10.0/tests/dataframe/test_plugins.py +226 -0
  199. etlantic-0.10.0/tests/dataframe/test_protocol.py +193 -0
  200. etlantic-0.10.0/tests/fixtures/__init__.py +0 -0
  201. etlantic-0.10.0/tests/fixtures/sample_pipeline.py +23 -0
  202. etlantic-0.10.0/tests/interchange/test_acceptance_0_2.py +144 -0
  203. etlantic-0.10.0/tests/interchange/test_regression_p0_2.py +209 -0
  204. etlantic-0.10.0/tests/interchange/test_regression_p0_3.py +103 -0
  205. etlantic-0.10.0/tests/keyring/test_keyring_provider.py +55 -0
  206. etlantic-0.10.0/tests/model/__init__.py +0 -0
  207. etlantic-0.10.0/tests/model/test_acceptance.py +142 -0
  208. etlantic-0.10.0/tests/orchestration/test_orchestration.py +218 -0
  209. etlantic-0.10.0/tests/plan/__init__.py +0 -0
  210. etlantic-0.10.0/tests/plan/test_planner.py +236 -0
  211. etlantic-0.10.0/tests/plan/test_serialize.py +69 -0
  212. etlantic-0.10.0/tests/profile/__init__.py +0 -0
  213. etlantic-0.10.0/tests/profile/test_profile.py +41 -0
  214. etlantic-0.10.0/tests/reliability/__init__.py +0 -0
  215. etlantic-0.10.0/tests/reliability/test_reliability.py +27 -0
  216. etlantic-0.10.0/tests/reports/__init__.py +0 -0
  217. etlantic-0.10.0/tests/reports/test_reports.py +26 -0
  218. etlantic-0.10.0/tests/runtime/__init__.py +0 -0
  219. etlantic-0.10.0/tests/runtime/test_bugfixes.py +311 -0
  220. etlantic-0.10.0/tests/runtime/test_local_runtime.py +216 -0
  221. etlantic-0.10.0/tests/runtime/test_reliability_runtime.py +48 -0
  222. etlantic-0.10.0/tests/runtime/test_selection.py +33 -0
  223. etlantic-0.10.0/tests/schema_drift/__init__.py +0 -0
  224. etlantic-0.10.0/tests/schema_drift/test_schema_drift.py +53 -0
  225. etlantic-0.10.0/tests/secrets/__init__.py +0 -0
  226. etlantic-0.10.0/tests/secrets/test_secrets.py +45 -0
  227. etlantic-0.10.0/tests/spark/__init__.py +1 -0
  228. etlantic-0.10.0/tests/spark/conftest.py +16 -0
  229. etlantic-0.10.0/tests/spark/test_spark_runtime.py +306 -0
  230. etlantic-0.10.0/tests/sparkforge/fixtures/ecommerce.json +53 -0
  231. etlantic-0.10.0/tests/sparkforge/test_adapter_parity.py +470 -0
  232. etlantic-0.10.0/tests/sql/conftest.py +17 -0
  233. etlantic-0.10.0/tests/sql/fixtures/compile_select_shape.json +6 -0
  234. etlantic-0.10.0/tests/sql/test_sql_golden.py +87 -0
  235. etlantic-0.10.0/tests/sql/test_sql_ir.py +47 -0
  236. etlantic-0.10.0/tests/sql/test_sql_regressions.py +237 -0
  237. etlantic-0.10.0/tests/sql/test_sql_runtime.py +178 -0
  238. etlantic-0.10.0/tests/sql/test_sql_security.py +79 -0
  239. etlantic-0.10.0/tests/sqlmodel/test_sqlmodel_bridge.py +46 -0
  240. etlantic-0.10.0/tests/storage/__init__.py +0 -0
  241. etlantic-0.10.0/tests/storage/test_storage.py +87 -0
  242. etlantic-0.10.0/tests/test_examples.py +46 -0
  243. etlantic-0.10.0/tests/unit/__init__.py +0 -0
  244. etlantic-0.10.0/tests/unit/test_data_facade.py +44 -0
  245. etlantic-0.10.0/tests/unit/test_diagnostics.py +29 -0
  246. etlantic-0.10.0/tests/unit/test_graph_validation.py +72 -0
  247. etlantic-0.10.0/tests/unit/test_identity.py +44 -0
  248. etlantic-0.10.0/tests/unit/test_package.py +47 -0
  249. etlantic-0.10.0/tests/unit/test_regression_p0.py +175 -0
  250. etlantic-0.10.0/tests/unit/test_subpipeline.py +48 -0
  251. etlantic-0.10.0/tests/unit/test_tooling_0_9.py +126 -0
  252. etlantic-0.10.0/tests/unit/test_transformation.py +49 -0
  253. etlantic-0.10.0/tests/validation/__init__.py +0 -0
  254. etlantic-0.10.0/tests/validation/test_phases.py +139 -0
@@ -0,0 +1,24 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.egg-info/
6
+ .eggs/
7
+ dist/
8
+ build/
9
+ site/
10
+ .venv/
11
+ venv/
12
+ .env
13
+
14
+ # Tools
15
+ .pytest_cache/
16
+ .ruff_cache/
17
+ .mypy_cache/
18
+ .coverage
19
+ htmlcov/
20
+ .DS_Store
21
+ examples/_file_storage_out/
22
+ examples/_generated_*.py
23
+ tmp_cli_contracts/
24
+ tmp_/
@@ -0,0 +1,382 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.10.0] - 2026-07-17
9
+
10
+ ### Added
11
+
12
+ - Optional `etlantic-sparkforge` migration adapter (IR → Pipeline / Profile)
13
+ - SparkForge debug/run-mode mapping to `RunSelection` / `RunIntent` / `DebugSession`
14
+ - SparkForge-shaped result normalization to `PipelineRunReport` with redaction
15
+ - Write / Delta capability compatibility helpers (fail closed)
16
+ - Representative ecommerce IR fixture and semantic parity suite
17
+ - Migration guide `docs/11_DEVELOPMENT/MIGRATION_0_9_TO_0_10.md`
18
+ - Runnable docs guides for Airflow compile and SparkForge adapter
19
+ - Docs status SSOT via CAPABILITIES + expanded `scripts/check_docs.py` guards
20
+
21
+ ### Changed
22
+
23
+ - Package version advances to 0.10 (SparkForge Migration Preview)
24
+ - Plugin packages require `etlantic>=0.10.0,<1.0`
25
+ - SparkForge adoption checklist prerequisites marked complete
26
+ - Release workflow paces PyPI uploads (10 minutes between packages)
27
+ - Install docs prefer from-source until `v0.10.0` wheels exist on PyPI
28
+ - Agent guidance lists `etlantic.viz` and optional `etlantic-airflow` for compile
29
+
30
+ ### Fixed
31
+
32
+ - Schema history refuses row-like metadata by key (no substring false positives)
33
+ - Core `redact_message` / `redact_value` cover HTTPS basic-auth and string leaves
34
+ - SparkForge report adapter redacts free-text errors, Bearer tokens, and DSNs
35
+ - `strict_delta=False` emits warnings for missing Delta capabilities (PMSF323)
36
+ - SparkForge IR missing step names emit `PMSF310` instead of raising `KeyError`
37
+ - Retry policy mapping clamps `max_attempts` to at least 1
38
+ - Unknown validation policy names fail closed (`KeyError`) instead of inventing
39
+ empty policies
40
+ - Testing helpers harden write-semantics, orchestrator secret scans, and missing
41
+ secret fail-closed behavior
42
+ - Adapter stops importing private `_PipelineNamespace`
43
+ - Docs SSOT: Graphviz/HTML/lineage, Spark, Airflow, and Mermaid status drift
44
+
45
+ ### Upgrade notes
46
+
47
+ - Install `etlantic-sparkforge` (or `etlantic[sparkforge]`) for the adapter
48
+ - ETLantic core remains free of bronze / silver / gold types
49
+ - Full SparkForge engine retirement remains a progressive path (see migration guide)
50
+ - Prefer `git tag v0.10.0 && git push origin v0.10.0` (not `git push --tags`)
51
+
52
+ ## [0.9.0] - 2026-07-17
53
+
54
+ ### Added
55
+
56
+ - CLI wrappers: `compile`, `generate`, `diff`, `plugin list|info`, schema family,
57
+ reliability ops, viz exporters, and `report compare`
58
+ - `Profile.plugin_allowlist` with version pins; production fail-closed trust
59
+ - `FileSchemaHistoryProvider`, SARIF/GitHub diagnostic renderers
60
+ - Reliability provider protocols (quality, statistical, reconciliation, env)
61
+ - Observability protocols, JSON console logger, optional OpenTelemetry adapter
62
+ - `FileReportStore` and report comparison helpers
63
+ - Graphviz DOT / HTML lineage / JSON lineage exporters (`etlantic.viz`)
64
+ - Optional packages `etlantic-keyring` and `etlantic-sqlmodel`
65
+ - IDE command/result JSON schemas (`etlantic.ide`)
66
+ - Notebook / IPython display helpers (`etlantic.notebook`)
67
+ - Agent guidance generators + `scripts/check_agent_guidance.py`
68
+ - Expanded `etlantic.testing` (orchestrator, secrets, write-semantics parity)
69
+ - Migration guide `docs/11_DEVELOPMENT/MIGRATION_0_8_TO_0_9.md`
70
+
71
+ ### Changed
72
+
73
+ - Package version advances to 0.9 (Tooling, SDK, and Ecosystem Readiness)
74
+ - Plugin packages require `etlantic>=0.9.0,<1.0`
75
+ - Graphviz / HTML / lineage docs promoted out of Future Design
76
+
77
+ ### Upgrade notes
78
+
79
+ - Production profiles should set `plugin_allowlist` explicitly
80
+ - Schema history stores fingerprints only — never source rows
81
+ - Core remains free of Airflow, Spark, SQL drivers, SQLModel, keyring, and OTel
82
+ unless extras / optional packages are installed
83
+
84
+ ## [0.8.0] - 2026-07-17
85
+
86
+ ### Added
87
+
88
+ - Versioned orchestration protocol (`etlantic.orchestration/1`) with compile,
89
+ artifact transport, retry-safety, and lifecycle correlation models
90
+ - Independently installable `etlantic-airflow` reference compiler
91
+ - `compile_plan(...)` and `PipelinePlan.compile(target=...)`
92
+ - `Profile.schedule`, `Profile.execution`, and
93
+ `required_orchestrator_capabilities`
94
+ - Entry-point group `etlantic.orchestrator_plugins`
95
+ - Runnable example `examples/airflow_compile.py`
96
+ - Migration guide `docs/11_DEVELOPMENT/MIGRATION_0_7_TO_0_8.md`
97
+
98
+ ### Changed
99
+
100
+ - Package version advances to 0.8 (External Orchestration)
101
+ - Plugin packages (polars/pandas/sql/pyspark/airflow) require
102
+ `etlantic>=0.8.0,<0.9`
103
+
104
+ ### Upgrade notes
105
+
106
+ - Install `etlantic-airflow` to enable Airflow DAG compilation
107
+ - Core remains free of Airflow, PySpark, and SQL driver dependencies
108
+ - Unsupported orchestrator semantics fail compilation visibly (`PMORCH3xx`)
109
+
110
+ ## [0.7.0] - 2026-07-17
111
+
112
+ ### Added
113
+
114
+ - Versioned Spark execution protocol (`etlantic.spark/1`) with dataset refs,
115
+ lazy region compile/execute, write intents, and UDF policy
116
+ - `Profile.spark_engine`, `spark_udf_policy`, `spark_streaming`, and
117
+ `required_spark_capabilities`
118
+ - Independently installable `etlantic-pyspark` plugin with local Spark provider
119
+ - Lazy Spark region fusion preserving logical step identities
120
+ - Contract ↔ Spark schema mapping that diagnoses lossy/unknown mappings
121
+ - Delta-compatible append/overwrite/merge write intents (fail-closed)
122
+ - Structured Streaming foundation types marked **experimental**
123
+ - Entry-point groups `etlantic.spark_plugins` and `etlantic.spark_providers`
124
+ - Migration guide `docs/11_DEVELOPMENT/MIGRATION_0_6_TO_0_7.md`
125
+
126
+ ### Changed
127
+
128
+ - Package version advances to 0.7 (Distributed Spark Execution)
129
+ - Planner prefers `spark_engine` over `sql_engine` / `dataframe_engine` when set
130
+ - Plugin packages (polars/pandas/sql/pyspark) require `etlantic>=0.7.0,<0.8`
131
+
132
+ ### Upgrade notes
133
+
134
+ - Install `etlantic-pyspark` to enable Spark execution
135
+ - Core remains free of PySpark and Delta dependencies
136
+ - Streaming APIs are experimental; batch Spark is the production path
137
+
138
+ ## [0.6.1] - 2026-07-16
139
+
140
+ ### Changed
141
+
142
+ - Renamed the project, Python package, CLI, plugins, documentation, and
143
+ distribution artifacts from Pipelantic to ETLantic
144
+ - Updated package discovery, plugin entry points, schemas, environment
145
+ variables, examples, and repository URLs to use the `etlantic` namespace
146
+
147
+ ## [0.6.0] - 2026-07-16
148
+
149
+ ### Added
150
+
151
+ - Versioned SQL execution protocol (`etlantic.sql/1`) with relation refs,
152
+ typed expressions, write intents, and dialect capability negotiation
153
+ - `Profile.sql_engine` for selecting a SQL backend during planning
154
+ - Independently installable `etlantic-sql` PostgreSQL reference plugin
155
+ (SQLAlchemy Core; SQLite usable for local demos)
156
+ - SQL→SQL execution without intermediate Python row fetches when fusion is
157
+ preserved
158
+ - Fail-closed merge and capability checks when a dialect cannot honor required
159
+ semantics
160
+ - Entry-point discovery group `etlantic.sql_plugins`
161
+ - Conformance helpers under `etlantic.testing` for SQL expressions
162
+
163
+ ### Changed
164
+
165
+ - Package version advances to 0.6 (SQL-Native Execution)
166
+ - Planning contexts for `sql` auto-require SQL capabilities when
167
+ `Profile.sql_engine` is set
168
+
169
+ ### Upgrade notes
170
+
171
+ - Install `etlantic-sql` separately; core stays driver-free
172
+ - Register SQL implementations with
173
+ `@TransformationClass.implementation("sql")`
174
+ - Set `Profile(sql_engine="sql")` to select the SQL backend
175
+ - Configure connections via `ETLANTIC_SQL_URL` (or plugin-specific wiring)
176
+ - Missing plugins or unsupported capabilities (e.g. MERGE without keys) fail
177
+ at validation/planning
178
+
179
+ ## [0.5.0] - 2026-07-16
180
+
181
+ ### Added
182
+
183
+ - Versioned dataframe execution protocol (`etlantic.dataframe/1`) with
184
+ materialize → invoke → normalize → validate → metrics → cleanup phases
185
+ - Expanded capability vocabulary: eager, lazy, Arrow import/export, zero-copy,
186
+ schema inspection, invalid-row separation, cancellation, thread-safety
187
+ - Planner recording of engine, plugin version, capabilities, collection points,
188
+ conversion boundaries, ownership, and validation policy on `PipelinePlan`
189
+ - Runtime delegation of Polars/Pandas steps through the dataframe protocol
190
+ without reselecting engines
191
+ - Independently installable `etlantic-polars` (eager + LazyFrame preservation)
192
+ and `etlantic-pandas` (eager, CoW/ownership isolation)
193
+ - Optional Arrow interchange helpers (PyArrow imported only when available)
194
+ - Entry-point discovery group `etlantic.dataframe_plugins`
195
+ - Conformance helpers in `etlantic.testing`
196
+ - uv workspace packaging for core + dataframe plugins
197
+
198
+ ### Changed
199
+
200
+ - Package version advances to 0.5 (Dataframe Execution)
201
+ - Built-in `local` registry plugin is a runtime/records path (`dataframe=False`),
202
+ not a dataframe engine
203
+ - Planning contexts for `polars`/`pandas` auto-require dataframe capabilities
204
+
205
+ ### Upgrade notes
206
+
207
+ - Install `etlantic-polars` or `etlantic-pandas` separately; core stays
208
+ engine-free
209
+ - Register dataframe implementations with
210
+ `@TransformationClass.implementation("polars")` or `"pandas"`
211
+ - Set `Profile.dataframe_engine` to `"polars"` or `"pandas"` to select a backend
212
+ - Missing plugins or unsupported capabilities (e.g. Pandas + lazy) fail at
213
+ validation/planning
214
+
215
+ ### Fixed
216
+
217
+ - Default `Pipeline.run` / CLI planning now uses plugins discovered on
218
+ `PipelineRuntime` (and entry-point discovery for plan-only contexts)
219
+ - Fan-out / unconsumed / cross-engine ports map to in-memory strategies instead
220
+ of durable records; durable conversion only follows durable strategies
221
+ - Per-port collect and validation; quarantine/reject populate invalid artifacts
222
+ and metrics
223
+ - Schema observation uses plugin `inspect_schema` for native frames
224
+ - Durable `ArtifactStore` refuses native frames/LazyFrames (fail closed)
225
+ - Discovery load failures emit warnings; LazyFrame dtype checks without row
226
+ collect; invoke kwargs prefer inputs over colliding parameters
227
+ - Core `from_arrow_table` no longer imports Polars/Pandas
228
+
229
+ ## [0.4.0] - 2026-07-16
230
+
231
+ ### Upgrade notes
232
+
233
+ - Register local executable transformations with
234
+ `@TransformationClass.implementation("local")`.
235
+ - Use the `development` profile for the built-in local runtime examples.
236
+ - Pandas, Polars, SQL, Spark, and Airflow plugins are not part of this release.
237
+
238
+ ### Known limitations
239
+
240
+ - The local report store is process-scoped.
241
+ - The package remains alpha and 0.x releases may contain breaking changes.
242
+
243
+ ### Added
244
+
245
+ - Local async-first runtime that executes `PipelinePlan`s in-process
246
+ - `Pipeline.run` / `Pipeline.arun` / `Pipeline.debug` entry points
247
+ - `RunIntent`, `RunSelection`, `RunRequest`, and materialization/retry/timeout
248
+ policies
249
+ - `PipelineRuntime` with lifespan, middleware, resource injection, callbacks,
250
+ and outbound event types
251
+ - Runtime-only `SecretValue` with env and mounted-file `SecretProvider`s,
252
+ bounded cache, and fail-closed resolution (planning remains secret-free)
253
+ - Storage bindings: `memory`, `callable`, `json`, `csv`, and `null` (no-write)
254
+ - Versioned `PipelineRunReport` with text/JSON/HTML renderers and in-process
255
+ report store
256
+ - Structured logging with central secret redaction and lifecycle/security events
257
+ - `SchemaDriftPolicy` observation hooks and local reliability helpers
258
+ (freshness, partition completeness, retry-safety, backfill/repair/no-write)
259
+ - CLI: `etlantic run` and `etlantic report show|export`
260
+ - Hard dependency on `anyio` for structured concurrency
261
+
262
+ ### Fixed
263
+
264
+ - Durable materialization no longer always writes workspace files; strategy
265
+ comes from the plan/request
266
+ - Missing transformation implementations fail closed (no silent identity
267
+ fallback or engine swap)
268
+ - Cancellation uses `anyio` cancelled-exc handling and returns a partial report
269
+ - Exception and diagnostic messages are redacted before entering reports/logs
270
+ - Binding `SecretRef` values are passed into storage context; unresolved
271
+ secrets still fail closed
272
+ - Plan `retry_max_attempts` / `timeout_seconds` merge into default `RunRequest`
273
+ policies
274
+ - Planner default binding provider is `memory` (`local`/`python` remain aliases)
275
+ - Binding overrides resolve registry descriptors for provider/location/secret
276
+ - Retry honors backoff/`retry_on` and retry-safety declarations; `CONTINUE`
277
+ soft-skips without failing the step status as hard failure
278
+ - Schema observations fingerprint observed data (not only the contract class)
279
+ - CLI `run` prints embedded reports on `PipelineExecutionError`
280
+ - Debug session invalidation clears shared artifact/memory state across reruns
281
+ - Resource `Inject` wiring, outbound `Emit` capture, report lineage, and
282
+ run/region lifespan helpers
283
+
284
+ ### Changed
285
+
286
+ - Package version and public status advance to 0.4 (Local Runtime and
287
+ Operational Model)
288
+ - `SecretRef` lives under the `etlantic.secrets` package alongside runtime
289
+ secret resolution types
290
+
291
+ ## [0.3.0] - 2026-07-16
292
+
293
+ ### Added
294
+
295
+ - `Data` as the preferred thin facade over ContractModel (`DataContractModel`
296
+ remains as a deprecated alias)
297
+ - Multi-phase validation (structural, reference, semantic, policy, capability)
298
+ with diagnostic actions and source symbols
299
+ - `Profile` templates, `SecretRef`, scoped registries, and capability negotiation
300
+ - Immutable secret-free `PipelinePlan` IR (`etlantic.plan/1`) with slicing,
301
+ explain output, and canonical fingerprints
302
+ - Schema-drift models (`NormalizedSchema`, observations, changes, `DriftImpact`)
303
+ - Portable reliability/intent models (freshness, write/materialization intents,
304
+ idempotency, evidence schemas)
305
+ - JSON Schemas for profiles, project config, and PipelinePlan
306
+ - `etlantic` CLI: `validate`, `inspect`, `plan`, and `plan explain`
307
+ (plus `plan --explain` alias, `--nodes`, and mutual exclusion for
308
+ `--run-one` / `--run-until`)
309
+ - `Pipeline.plan()` / `Pipeline.explain_plan()`
310
+
311
+ ### Fixed
312
+
313
+ - `run_until` selects declaration-order prefix (not only upstream closure)
314
+ - Unknown plan selections fail closed with `PMPLAN501`
315
+ - Multi-engine regions and cross-engine durable artifact strategies
316
+ - Profile snapshot included in plan fingerprint
317
+ - Strict policy requires registered transformation implementations
318
+ - Subpipeline validation inherits parent planning context
319
+ - Plan JSON round-trip restores `secret_ref` and verifies fingerprints
320
+ - Schema-only DTCS ports map `datetime`/`decimal`/`binary` correctly
321
+ - Diff APIs return diagnostics for malformed toolkit input
322
+
323
+ ### Changed
324
+
325
+ - Package version and public status advance to 0.3 (Validation and Pipeline Plan IR)
326
+ - Explicit `click` dependency for the CLI plan command group (Typer 0.15+ no
327
+ longer pulls it in transitively)
328
+
329
+ ## [0.2.0] - 2026-07-16
330
+
331
+ ### Added
332
+
333
+ - Contract interoperability for ODCS (via ContractModel), DTCS, and DPCS
334
+ - `Transformation.to_dtcs` / `from_dtcs` and `Pipeline.to_dpcs` / `from_dpcs`
335
+ - Deterministic `ContractBundle` generation via `generate_contracts` /
336
+ `write_contracts` / `load_bundle`
337
+ - ODCS facades `load_data_contract` and `write_odcs`
338
+ - Diff hooks: `diff_data_contracts`, `diff_transformations`, `diff_pipelines`
339
+ - Supported-version policy, bounded safe loaders, and source-aware diagnostics
340
+ - Dependencies on the published `dtcs` and `dpcs` toolkits
341
+
342
+ ### Fixed
343
+
344
+ - Map ContractModel `number`/`datetime` fields to DTCS `decimal`/`datetime`
345
+ - Emit transformation parameters as `etlantic:parameters` (toolkit-valid)
346
+ - Round-trip DPCS step parameter overrides
347
+ - Treat matching published ODCS ids as compatible in `PMPIPE210` checks
348
+ - Recursively validate nested subpipelines
349
+ - Clear stale cyclic graph-build errors on fresh `build_graph()`
350
+ - Fail closed on DPCS diff incompatible categories and bad DTCS parse input
351
+ - Detect published-id / filename slug collisions during bundle generation
352
+ - Resolve `odcs:`-prefixed contract registry keys in `from_dtcs`
353
+ - Expose `ValidationReport.has_errors` for the documented validation UX
354
+ - Correct getting-started imports to use `etlantic.DataContractModel`
355
+ (ContractModel does not export `DataContractModel`)
356
+
357
+ ## [0.1.0] - 2026-07-16
358
+
359
+ ### Added
360
+
361
+ - First public release as **ETLantic** (PyPI package `etlantic`)
362
+ - Typed modeling kernel for authoring pipelines without an execution backend
363
+ - `Transformation`, `Input`, `Output`, and `Parameter` port annotations
364
+ - `Pipeline`, `Source`, `Step`, `Sink`, and subpipeline composition
365
+ - Typed `OutputRef` wiring with stable node and port identities
366
+ - Structural validation diagnostics (cycles, missing refs, incompatible ports)
367
+ - Logical graph inspection and Mermaid diagram generation
368
+ - ContractModel integration boundary via `DataContractModel` alias
369
+ - uv + ruff toolchain, MkDocs documentation site, shared GitHub Actions
370
+ checks, and tag-triggered PyPI release
371
+
372
+ [0.10.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.10.0
373
+ [0.9.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.9.0
374
+ [0.8.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.8.0
375
+ [0.7.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.7.0
376
+ [0.6.1]: https://github.com/eddiethedean/etlantic/releases/tag/v0.6.1
377
+ [0.6.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.6.0
378
+ [0.5.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.5.0
379
+ [0.4.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.4.0
380
+ [0.3.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.3.0
381
+ [0.2.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.2.0
382
+ [0.1.0]: https://github.com/eddiethedean/etlantic/releases/tag/v0.1.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Odo Matthews
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,235 @@
1
+ Metadata-Version: 2.4
2
+ Name: etlantic
3
+ Version: 0.10.0
4
+ Summary: Typed, contract-driven data pipeline modeling for Python.
5
+ Project-URL: Homepage, https://github.com/eddiethedean/etlantic
6
+ Project-URL: Documentation, https://github.com/eddiethedean/etlantic/tree/main/docs
7
+ Project-URL: Repository, https://github.com/eddiethedean/etlantic
8
+ Project-URL: Issues, https://github.com/eddiethedean/etlantic/issues
9
+ Project-URL: Changelog, https://github.com/eddiethedean/etlantic/blob/main/CHANGELOG.md
10
+ Author-email: Odo Matthews <odosmatthews@gmail.com>
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: data-contracts,etl,pipelines,pydantic,typed
14
+ Classifier: Development Status :: 3 - Alpha
15
+ Classifier: Intended Audience :: Developers
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Typing :: Typed
22
+ Requires-Python: >=3.11
23
+ Requires-Dist: anyio<5,>=4
24
+ Requires-Dist: click<9,>=8
25
+ Requires-Dist: contractmodel>=0.1.2
26
+ Requires-Dist: dpcs<1,>=0.13
27
+ Requires-Dist: dtcs<1,>=0.11
28
+ Requires-Dist: packaging>=24
29
+ Requires-Dist: pydantic<3,>=2.12
30
+ Requires-Dist: typer<1,>=0.15
31
+ Provides-Extra: airflow
32
+ Requires-Dist: etlantic-airflow==0.10.0; extra == 'airflow'
33
+ Provides-Extra: arrow
34
+ Requires-Dist: pyarrow>=14; extra == 'arrow'
35
+ Provides-Extra: dataframes
36
+ Requires-Dist: etlantic-pandas==0.10.0; extra == 'dataframes'
37
+ Requires-Dist: etlantic-polars==0.10.0; extra == 'dataframes'
38
+ Provides-Extra: keyring
39
+ Requires-Dist: etlantic-keyring==0.10.0; extra == 'keyring'
40
+ Provides-Extra: observability
41
+ Requires-Dist: opentelemetry-api<2,>=1.36; extra == 'observability'
42
+ Provides-Extra: otel
43
+ Requires-Dist: opentelemetry-api<2,>=1.36; extra == 'otel'
44
+ Provides-Extra: pandas
45
+ Requires-Dist: etlantic-pandas==0.10.0; extra == 'pandas'
46
+ Provides-Extra: polars
47
+ Requires-Dist: etlantic-polars==0.10.0; extra == 'polars'
48
+ Provides-Extra: postgresql
49
+ Requires-Dist: etlantic-sql==0.10.0; extra == 'postgresql'
50
+ Provides-Extra: pyspark
51
+ Requires-Dist: etlantic-pyspark==0.10.0; extra == 'pyspark'
52
+ Provides-Extra: spark
53
+ Requires-Dist: etlantic-pyspark==0.10.0; extra == 'spark'
54
+ Provides-Extra: sparkforge
55
+ Requires-Dist: etlantic-sparkforge==0.10.0; extra == 'sparkforge'
56
+ Provides-Extra: sql
57
+ Requires-Dist: etlantic-sql==0.10.0; extra == 'sql'
58
+ Provides-Extra: sqlmodel
59
+ Requires-Dist: etlantic-sqlmodel==0.10.0; extra == 'sqlmodel'
60
+ Description-Content-Type: text/markdown
61
+
62
+ ![ETLantic banner](https://raw.githubusercontent.com/eddiethedean/etlantic/main/docs/theme/assets/etlantic-banner.png)
63
+
64
+ # ETLantic
65
+
66
+ Catch incompatible data-pipeline wiring before you process data.
67
+
68
+ Define datasets, transformations, and pipelines as typed Python classes.
69
+ Validate and plan them once. Run locally today; swap Polars, Pandas, or SQL
70
+ backends without rewriting the logical pipeline.
71
+
72
+ **Status:** Alpha **0.10.0** — local runtime + optional
73
+ Polars/Pandas/SQL/PySpark/Airflow plugins. Structured Streaming is
74
+ experimental.
75
+
76
+ > **Install note:** Until a matching `v0.10.0` tag is published to PyPI, prefer
77
+ > installing from source (below). Anonymous `pip install etlantic` may fail if
78
+ > wheels are not yet uploaded.
79
+
80
+ ## Install (from source — works today)
81
+
82
+ Requires Python 3.11+ and [uv](https://docs.astral.sh/uv/).
83
+
84
+ ```bash
85
+ git clone https://github.com/eddiethedean/etlantic.git
86
+ cd etlantic
87
+ uv sync
88
+ uv run python -c "import etlantic; print(etlantic.__version__)"
89
+ uv run python examples/quickstart.py
90
+ ```
91
+
92
+ ### Optional when wheels are on PyPI
93
+
94
+ ```bash
95
+ pip install etlantic
96
+ # optional engines / compilers
97
+ pip install etlantic-polars etlantic-pandas etlantic-sql
98
+ pip install etlantic-pyspark etlantic-airflow
99
+ pip install etlantic-keyring etlantic-sqlmodel etlantic-sparkforge
100
+ ```
101
+
102
+ ## Quick example
103
+
104
+ ```python
105
+ from etlantic import (
106
+ Data,
107
+ Input,
108
+ Output,
109
+ Pipeline,
110
+ PipelineRuntime,
111
+ Sink,
112
+ Source,
113
+ Transformation,
114
+ )
115
+
116
+
117
+ class RawCustomer(Data):
118
+ customer_id: int
119
+ first_name: str
120
+ last_name: str
121
+
122
+
123
+ class Customer(Data):
124
+ customer_id: int
125
+ full_name: str
126
+
127
+
128
+ class NormalizeCustomers(Transformation):
129
+ customers: Input[RawCustomer]
130
+ result: Output[Customer]
131
+
132
+
133
+ class CustomerPipeline(Pipeline):
134
+ raw: Source[RawCustomer] = Source(binding="customer_source")
135
+ normalized = NormalizeCustomers.step(customers=raw)
136
+ curated: Sink[Customer] = Sink(
137
+ input=normalized.result,
138
+ binding="customer_sink",
139
+ )
140
+
141
+
142
+ @NormalizeCustomers.implementation("local")
143
+ def normalize(customers: list[RawCustomer]) -> list[Customer]:
144
+ return [
145
+ Customer(
146
+ customer_id=row.customer_id,
147
+ full_name=f"{row.first_name} {row.last_name}",
148
+ )
149
+ for row in customers
150
+ ]
151
+
152
+
153
+ CustomerPipeline.validate(profile="development").raise_for_errors()
154
+
155
+ runtime = PipelineRuntime()
156
+ runtime.memory.seed(
157
+ "customer_source",
158
+ [RawCustomer(customer_id=1, first_name="Ada", last_name="Lovelace")],
159
+ )
160
+ run_report = CustomerPipeline.run(profile="development", runtime=runtime)
161
+ print(runtime.memory.get("customer_sink"))
162
+ ```
163
+
164
+ Run the complete tested version at
165
+ [examples/quickstart.py](examples/quickstart.py).
166
+
167
+ ## Current capability boundary
168
+
169
+ | Capability | 0.10 |
170
+ |---|---|
171
+ | Typed modeling, validation, contracts, and planning | Available |
172
+ | Local Python execution and run reports | Available |
173
+ | Memory, callable, JSON, CSV, and no-write storage | Available |
174
+ | Polars and Pandas dataframe plugins | Available (`etlantic-polars` / `etlantic-pandas`) |
175
+ | SQL plugin | Available (`etlantic-sql`) |
176
+ | PySpark plugin + local provider | Available (`etlantic-pyspark`) |
177
+ | Structured Streaming | Experimental |
178
+ | Airflow orchestrator compiler | Available (`etlantic-airflow`) |
179
+ | CLI compile / generate / schema / SARIF | Available |
180
+ | Plugin allowlists / keyring / SQLModel extras | Available |
181
+ | SparkForge migration adapter | Available (`etlantic-sparkforge`) |
182
+
183
+ **Next design line:** releases 0.11-0.15 are planned to add a PySpark-inspired
184
+ portable transformation language, followed by Polars, PySpark, Pandas, and safe
185
+ SQL compilers. This is documented future design, not part of the 0.10 API. See
186
+ the [portable transformation design](docs/04_TRANSFORMATIONS/PORTABLE_TRANSFORMATIONS.md)
187
+ and [roadmap](docs/11_DEVELOPMENT/ROADMAP.md).
188
+
189
+ ## Documentation
190
+
191
+ - [Getting Started](docs/01_GETTING_STARTED/README.md) (start here)
192
+ - [Capabilities and Limitations](docs/01_GETTING_STARTED/CAPABILITIES.md)
193
+ - [Quickstart](docs/01_GETTING_STARTED/QUICKSTART.md)
194
+ - [Evaluator brief](docs/01_GETTING_STARTED/EVALUATOR.md)
195
+ - [Core Concepts](docs/02_FOUNDATIONS/CORE_CONCEPTS.md)
196
+ - [Architecture](docs/02_FOUNDATIONS/ARCHITECTURE.md)
197
+ - [Roadmap](docs/11_DEVELOPMENT/ROADMAP.md)
198
+
199
+ Build the docs locally with `uv run mkdocs serve` (hosted site TBD).
200
+
201
+ ## Development
202
+
203
+ Requires [uv](https://docs.astral.sh/uv/).
204
+
205
+ ```bash
206
+ uv sync
207
+ uv run pytest
208
+ uv run ruff check .
209
+ uv run ruff format .
210
+ ```
211
+
212
+ `uv sync` creates `.venv`, installs the package in editable mode, and installs
213
+ the `dev` dependency group (pytest, ruff, mkdocs) by default.
214
+
215
+ ## Release
216
+
217
+ The first upload of each new package name counts against PyPI’s new-project
218
+ rate limit (`429 Too many new projects created`). Release CI waits **10 minutes**
219
+ between package publishes. See
220
+ [Release Process](docs/11_DEVELOPMENT/RELEASE_PROCESS.md).
221
+
222
+ Tag a version that matches `src/etlantic/_version.py` (and every
223
+ `packages/*/pyproject.toml`), then push **only that tag**:
224
+
225
+ ```bash
226
+ git tag -a v0.10.0 -m "ETLantic 0.10.0"
227
+ git push origin v0.10.0
228
+ ```
229
+
230
+ Do not use `git push --tags`. GitHub Actions runs checks and publishes to PyPI
231
+ using the `PYPI_API_TOKEN` repository secret.
232
+
233
+ ## License
234
+
235
+ MIT