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.
- etlantic-0.10.0/.gitignore +24 -0
- etlantic-0.10.0/CHANGELOG.md +382 -0
- etlantic-0.10.0/LICENSE +21 -0
- etlantic-0.10.0/PKG-INFO +235 -0
- etlantic-0.10.0/README.md +174 -0
- etlantic-0.10.0/SECURITY.md +62 -0
- etlantic-0.10.0/examples/README.md +70 -0
- etlantic-0.10.0/examples/airflow_compile.py +107 -0
- etlantic-0.10.0/examples/dataframe_parity.py +87 -0
- etlantic-0.10.0/examples/file_storage.py +98 -0
- etlantic-0.10.0/examples/pyspark_local.py +75 -0
- etlantic-0.10.0/examples/quickstart.py +73 -0
- etlantic-0.10.0/examples/sql_boundary_hybrid.py +93 -0
- etlantic-0.10.0/examples/sql_failure_recovery.py +79 -0
- etlantic-0.10.0/examples/sql_to_sql.py +119 -0
- etlantic-0.10.0/examples/sql_transactional_write.py +83 -0
- etlantic-0.10.0/packages/etlantic-airflow/README.md +37 -0
- etlantic-0.10.0/packages/etlantic-airflow/pyproject.toml +38 -0
- etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/__init__.py +16 -0
- etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/loader.py +50 -0
- etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/operator.py +58 -0
- etlantic-0.10.0/packages/etlantic-airflow/src/etlantic_airflow/plugin.py +251 -0
- etlantic-0.10.0/packages/etlantic-keyring/README.md +33 -0
- etlantic-0.10.0/packages/etlantic-keyring/pyproject.toml +36 -0
- etlantic-0.10.0/packages/etlantic-keyring/src/etlantic_keyring/__init__.py +93 -0
- etlantic-0.10.0/packages/etlantic-pandas/README.md +11 -0
- etlantic-0.10.0/packages/etlantic-pandas/pyproject.toml +42 -0
- etlantic-0.10.0/packages/etlantic-pandas/src/etlantic_pandas/__init__.py +267 -0
- etlantic-0.10.0/packages/etlantic-polars/README.md +12 -0
- etlantic-0.10.0/packages/etlantic-polars/pyproject.toml +42 -0
- etlantic-0.10.0/packages/etlantic-polars/src/etlantic_polars/__init__.py +342 -0
- etlantic-0.10.0/packages/etlantic-pyspark/README.md +34 -0
- etlantic-0.10.0/packages/etlantic-pyspark/pyproject.toml +45 -0
- etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/__init__.py +16 -0
- etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/plugin.py +449 -0
- etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/provider.py +155 -0
- etlantic-0.10.0/packages/etlantic-pyspark/src/etlantic_pyspark/sparkless_shim.py +65 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/README.md +88 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/pyproject.toml +38 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/__init__.py +61 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/adapt.py +573 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/compat.py +155 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/ir.py +197 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/reports.py +341 -0
- etlantic-0.10.0/packages/etlantic-sparkforge/src/etlantic_sparkforge/runtime_map.py +104 -0
- etlantic-0.10.0/packages/etlantic-sql/README.md +43 -0
- etlantic-0.10.0/packages/etlantic-sql/pyproject.toml +43 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/__init__.py +9 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/catalog.py +54 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/compiler.py +190 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/dialect_postgresql.py +26 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/executor.py +344 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/plugin.py +247 -0
- etlantic-0.10.0/packages/etlantic-sql/src/etlantic_sql/writes.py +19 -0
- etlantic-0.10.0/packages/etlantic-sqlmodel/README.md +45 -0
- etlantic-0.10.0/packages/etlantic-sqlmodel/pyproject.toml +36 -0
- etlantic-0.10.0/packages/etlantic-sqlmodel/src/etlantic_sqlmodel/__init__.py +351 -0
- etlantic-0.10.0/pyproject.toml +223 -0
- etlantic-0.10.0/src/etlantic/__init__.py +299 -0
- etlantic-0.10.0/src/etlantic/_version.py +1 -0
- etlantic-0.10.0/src/etlantic/agents.py +146 -0
- etlantic-0.10.0/src/etlantic/capabilities.py +293 -0
- etlantic-0.10.0/src/etlantic/cli/__init__.py +427 -0
- etlantic-0.10.0/src/etlantic/cli/__main__.py +6 -0
- etlantic-0.10.0/src/etlantic/cli/commands.py +655 -0
- etlantic-0.10.0/src/etlantic/contracts.py +73 -0
- etlantic-0.10.0/src/etlantic/dataframe/__init__.py +54 -0
- etlantic-0.10.0/src/etlantic/dataframe/arrow.py +91 -0
- etlantic-0.10.0/src/etlantic/dataframe/discovery.py +80 -0
- etlantic-0.10.0/src/etlantic/dataframe/helpers.py +125 -0
- etlantic-0.10.0/src/etlantic/dataframe/protocol.py +265 -0
- etlantic-0.10.0/src/etlantic/diagnostics/__init__.py +140 -0
- etlantic-0.10.0/src/etlantic/diagnostics/github.py +27 -0
- etlantic-0.10.0/src/etlantic/diagnostics/sarif.py +66 -0
- etlantic-0.10.0/src/etlantic/exceptions.py +91 -0
- etlantic-0.10.0/src/etlantic/ide/__init__.py +162 -0
- etlantic-0.10.0/src/etlantic/identity.py +93 -0
- etlantic-0.10.0/src/etlantic/inspection.py +18 -0
- etlantic-0.10.0/src/etlantic/interchange/__init__.py +50 -0
- etlantic-0.10.0/src/etlantic/interchange/bundle.py +333 -0
- etlantic-0.10.0/src/etlantic/interchange/diagnostics.py +74 -0
- etlantic-0.10.0/src/etlantic/interchange/diff.py +249 -0
- etlantic-0.10.0/src/etlantic/interchange/dpcs.py +649 -0
- etlantic-0.10.0/src/etlantic/interchange/dtcs.py +403 -0
- etlantic-0.10.0/src/etlantic/interchange/normalize.py +29 -0
- etlantic-0.10.0/src/etlantic/interchange/odcs.py +180 -0
- etlantic-0.10.0/src/etlantic/interchange/policy.py +148 -0
- etlantic-0.10.0/src/etlantic/interchange/provenance.py +25 -0
- etlantic-0.10.0/src/etlantic/interchange/security.py +105 -0
- etlantic-0.10.0/src/etlantic/lifecycle/__init__.py +25 -0
- etlantic-0.10.0/src/etlantic/lifecycle/callbacks.py +57 -0
- etlantic-0.10.0/src/etlantic/lifecycle/lifespan.py +26 -0
- etlantic-0.10.0/src/etlantic/lifecycle/middleware.py +39 -0
- etlantic-0.10.0/src/etlantic/lifecycle/outbound.py +26 -0
- etlantic-0.10.0/src/etlantic/lifecycle/resources.py +93 -0
- etlantic-0.10.0/src/etlantic/lifecycle/runtime.py +239 -0
- etlantic-0.10.0/src/etlantic/mermaid.py +44 -0
- etlantic-0.10.0/src/etlantic/model.py +106 -0
- etlantic-0.10.0/src/etlantic/notebook.py +130 -0
- etlantic-0.10.0/src/etlantic/observability.py +90 -0
- etlantic-0.10.0/src/etlantic/orchestration/__init__.py +99 -0
- etlantic-0.10.0/src/etlantic/orchestration/artifacts.py +114 -0
- etlantic-0.10.0/src/etlantic/orchestration/compile.py +138 -0
- etlantic-0.10.0/src/etlantic/orchestration/discovery.py +73 -0
- etlantic-0.10.0/src/etlantic/orchestration/lifecycle.py +223 -0
- etlantic-0.10.0/src/etlantic/orchestration/mapping.py +146 -0
- etlantic-0.10.0/src/etlantic/orchestration/protocol.py +289 -0
- etlantic-0.10.0/src/etlantic/orchestration/reliability.py +181 -0
- etlantic-0.10.0/src/etlantic/pipeline.py +859 -0
- etlantic-0.10.0/src/etlantic/plan/__init__.py +34 -0
- etlantic-0.10.0/src/etlantic/plan/artifacts.py +77 -0
- etlantic-0.10.0/src/etlantic/plan/explain.py +87 -0
- etlantic-0.10.0/src/etlantic/plan/model.py +333 -0
- etlantic-0.10.0/src/etlantic/plan/planner.py +1085 -0
- etlantic-0.10.0/src/etlantic/plan/regions.py +73 -0
- etlantic-0.10.0/src/etlantic/plan/serialize.py +73 -0
- etlantic-0.10.0/src/etlantic/plan/slicing.py +81 -0
- etlantic-0.10.0/src/etlantic/plugin_trust.py +123 -0
- etlantic-0.10.0/src/etlantic/policy.py +88 -0
- etlantic-0.10.0/src/etlantic/ports.py +111 -0
- etlantic-0.10.0/src/etlantic/profile.py +192 -0
- etlantic-0.10.0/src/etlantic/py.typed +0 -0
- etlantic-0.10.0/src/etlantic/refs.py +65 -0
- etlantic-0.10.0/src/etlantic/registry.py +270 -0
- etlantic-0.10.0/src/etlantic/reliability.py +277 -0
- etlantic-0.10.0/src/etlantic/reliability_providers.py +169 -0
- etlantic-0.10.0/src/etlantic/reliability_runtime.py +187 -0
- etlantic-0.10.0/src/etlantic/reports/__init__.py +36 -0
- etlantic-0.10.0/src/etlantic/reports/file_store.py +71 -0
- etlantic-0.10.0/src/etlantic/reports/model.py +315 -0
- etlantic-0.10.0/src/etlantic/reports/render.py +77 -0
- etlantic-0.10.0/src/etlantic/reports/store.py +38 -0
- etlantic-0.10.0/src/etlantic/runtime/__init__.py +47 -0
- etlantic-0.10.0/src/etlantic/runtime/artifacts.py +116 -0
- etlantic-0.10.0/src/etlantic/runtime/breakpoints.py +54 -0
- etlantic-0.10.0/src/etlantic/runtime/context.py +38 -0
- etlantic-0.10.0/src/etlantic/runtime/dataframe_exec.py +328 -0
- etlantic-0.10.0/src/etlantic/runtime/events.py +85 -0
- etlantic-0.10.0/src/etlantic/runtime/execute.py +272 -0
- etlantic-0.10.0/src/etlantic/runtime/invoke.py +23 -0
- etlantic-0.10.0/src/etlantic/runtime/logging.py +132 -0
- etlantic-0.10.0/src/etlantic/runtime/orchestrator.py +2049 -0
- etlantic-0.10.0/src/etlantic/runtime/request.py +265 -0
- etlantic-0.10.0/src/etlantic/runtime/spark_exec.py +427 -0
- etlantic-0.10.0/src/etlantic/runtime/sql_exec.py +298 -0
- etlantic-0.10.0/src/etlantic/runtime/state.py +46 -0
- etlantic-0.10.0/src/etlantic/schema_drift.py +365 -0
- etlantic-0.10.0/src/etlantic/schema_history.py +137 -0
- etlantic-0.10.0/src/etlantic/schema_policy.py +151 -0
- etlantic-0.10.0/src/etlantic/schemas/__init__.py +32 -0
- etlantic-0.10.0/src/etlantic/schemas/pipeline-plan.schema.json +40 -0
- etlantic-0.10.0/src/etlantic/schemas/pipeline-run-report.schema.json +40 -0
- etlantic-0.10.0/src/etlantic/schemas/profile.schema.json +46 -0
- etlantic-0.10.0/src/etlantic/schemas/project-config.schema.json +16 -0
- etlantic-0.10.0/src/etlantic/secrets/__init__.py +30 -0
- etlantic-0.10.0/src/etlantic/secrets/cache.py +81 -0
- etlantic-0.10.0/src/etlantic/secrets/env.py +66 -0
- etlantic-0.10.0/src/etlantic/secrets/file.py +84 -0
- etlantic-0.10.0/src/etlantic/secrets/provider.py +89 -0
- etlantic-0.10.0/src/etlantic/secrets/ref.py +40 -0
- etlantic-0.10.0/src/etlantic/secrets/value.py +56 -0
- etlantic-0.10.0/src/etlantic/spark/__init__.py +111 -0
- etlantic-0.10.0/src/etlantic/spark/discovery.py +106 -0
- etlantic-0.10.0/src/etlantic/spark/protocol.py +420 -0
- etlantic-0.10.0/src/etlantic/spark/provider.py +134 -0
- etlantic-0.10.0/src/etlantic/spark/schema.py +283 -0
- etlantic-0.10.0/src/etlantic/spark/streaming.py +100 -0
- etlantic-0.10.0/src/etlantic/sql/__init__.py +89 -0
- etlantic-0.10.0/src/etlantic/sql/discovery.py +71 -0
- etlantic-0.10.0/src/etlantic/sql/expression.py +66 -0
- etlantic-0.10.0/src/etlantic/sql/helpers.py +51 -0
- etlantic-0.10.0/src/etlantic/sql/protocol.py +489 -0
- etlantic-0.10.0/src/etlantic/sql/write.py +75 -0
- etlantic-0.10.0/src/etlantic/storage/__init__.py +21 -0
- etlantic-0.10.0/src/etlantic/storage/callable_binding.py +67 -0
- etlantic-0.10.0/src/etlantic/storage/csv_binding.py +88 -0
- etlantic-0.10.0/src/etlantic/storage/json_binding.py +73 -0
- etlantic-0.10.0/src/etlantic/storage/memory.py +54 -0
- etlantic-0.10.0/src/etlantic/storage/null.py +40 -0
- etlantic-0.10.0/src/etlantic/storage/protocol.py +68 -0
- etlantic-0.10.0/src/etlantic/symbols.py +117 -0
- etlantic-0.10.0/src/etlantic/testing/__init__.py +38 -0
- etlantic-0.10.0/src/etlantic/testing/dataframe.py +111 -0
- etlantic-0.10.0/src/etlantic/testing/orchestrator.py +49 -0
- etlantic-0.10.0/src/etlantic/testing/secrets.py +89 -0
- etlantic-0.10.0/src/etlantic/testing/sql.py +56 -0
- etlantic-0.10.0/src/etlantic/testing/write_semantics.py +64 -0
- etlantic-0.10.0/src/etlantic/transformation.py +324 -0
- etlantic-0.10.0/src/etlantic/validation.py +786 -0
- etlantic-0.10.0/src/etlantic/viz.py +197 -0
- etlantic-0.10.0/tests/__init__.py +0 -0
- etlantic-0.10.0/tests/airflow/test_airflow_compile.py +181 -0
- etlantic-0.10.0/tests/cli/__init__.py +0 -0
- etlantic-0.10.0/tests/cli/test_cli.py +101 -0
- etlantic-0.10.0/tests/conftest.py +31 -0
- etlantic-0.10.0/tests/dataframe/test_conformance.py +31 -0
- etlantic-0.10.0/tests/dataframe/test_correctness.py +272 -0
- etlantic-0.10.0/tests/dataframe/test_plugins.py +226 -0
- etlantic-0.10.0/tests/dataframe/test_protocol.py +193 -0
- etlantic-0.10.0/tests/fixtures/__init__.py +0 -0
- etlantic-0.10.0/tests/fixtures/sample_pipeline.py +23 -0
- etlantic-0.10.0/tests/interchange/test_acceptance_0_2.py +144 -0
- etlantic-0.10.0/tests/interchange/test_regression_p0_2.py +209 -0
- etlantic-0.10.0/tests/interchange/test_regression_p0_3.py +103 -0
- etlantic-0.10.0/tests/keyring/test_keyring_provider.py +55 -0
- etlantic-0.10.0/tests/model/__init__.py +0 -0
- etlantic-0.10.0/tests/model/test_acceptance.py +142 -0
- etlantic-0.10.0/tests/orchestration/test_orchestration.py +218 -0
- etlantic-0.10.0/tests/plan/__init__.py +0 -0
- etlantic-0.10.0/tests/plan/test_planner.py +236 -0
- etlantic-0.10.0/tests/plan/test_serialize.py +69 -0
- etlantic-0.10.0/tests/profile/__init__.py +0 -0
- etlantic-0.10.0/tests/profile/test_profile.py +41 -0
- etlantic-0.10.0/tests/reliability/__init__.py +0 -0
- etlantic-0.10.0/tests/reliability/test_reliability.py +27 -0
- etlantic-0.10.0/tests/reports/__init__.py +0 -0
- etlantic-0.10.0/tests/reports/test_reports.py +26 -0
- etlantic-0.10.0/tests/runtime/__init__.py +0 -0
- etlantic-0.10.0/tests/runtime/test_bugfixes.py +311 -0
- etlantic-0.10.0/tests/runtime/test_local_runtime.py +216 -0
- etlantic-0.10.0/tests/runtime/test_reliability_runtime.py +48 -0
- etlantic-0.10.0/tests/runtime/test_selection.py +33 -0
- etlantic-0.10.0/tests/schema_drift/__init__.py +0 -0
- etlantic-0.10.0/tests/schema_drift/test_schema_drift.py +53 -0
- etlantic-0.10.0/tests/secrets/__init__.py +0 -0
- etlantic-0.10.0/tests/secrets/test_secrets.py +45 -0
- etlantic-0.10.0/tests/spark/__init__.py +1 -0
- etlantic-0.10.0/tests/spark/conftest.py +16 -0
- etlantic-0.10.0/tests/spark/test_spark_runtime.py +306 -0
- etlantic-0.10.0/tests/sparkforge/fixtures/ecommerce.json +53 -0
- etlantic-0.10.0/tests/sparkforge/test_adapter_parity.py +470 -0
- etlantic-0.10.0/tests/sql/conftest.py +17 -0
- etlantic-0.10.0/tests/sql/fixtures/compile_select_shape.json +6 -0
- etlantic-0.10.0/tests/sql/test_sql_golden.py +87 -0
- etlantic-0.10.0/tests/sql/test_sql_ir.py +47 -0
- etlantic-0.10.0/tests/sql/test_sql_regressions.py +237 -0
- etlantic-0.10.0/tests/sql/test_sql_runtime.py +178 -0
- etlantic-0.10.0/tests/sql/test_sql_security.py +79 -0
- etlantic-0.10.0/tests/sqlmodel/test_sqlmodel_bridge.py +46 -0
- etlantic-0.10.0/tests/storage/__init__.py +0 -0
- etlantic-0.10.0/tests/storage/test_storage.py +87 -0
- etlantic-0.10.0/tests/test_examples.py +46 -0
- etlantic-0.10.0/tests/unit/__init__.py +0 -0
- etlantic-0.10.0/tests/unit/test_data_facade.py +44 -0
- etlantic-0.10.0/tests/unit/test_diagnostics.py +29 -0
- etlantic-0.10.0/tests/unit/test_graph_validation.py +72 -0
- etlantic-0.10.0/tests/unit/test_identity.py +44 -0
- etlantic-0.10.0/tests/unit/test_package.py +47 -0
- etlantic-0.10.0/tests/unit/test_regression_p0.py +175 -0
- etlantic-0.10.0/tests/unit/test_subpipeline.py +48 -0
- etlantic-0.10.0/tests/unit/test_tooling_0_9.py +126 -0
- etlantic-0.10.0/tests/unit/test_transformation.py +49 -0
- etlantic-0.10.0/tests/validation/__init__.py +0 -0
- 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
|
etlantic-0.10.0/LICENSE
ADDED
|
@@ -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.
|
etlantic-0.10.0/PKG-INFO
ADDED
|
@@ -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
|
+

|
|
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
|