contractforge-databricks 0.1.0__tar.gz → 0.2.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.
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/.gitignore +11 -0
- contractforge_databricks-0.2.0/CHANGELOG.md +31 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/PKG-INFO +7 -7
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/pyproject.toml +7 -7
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli.py +10 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_deploy.py +25 -2
- contractforge_databricks-0.2.0/src/contractforge_databricks/cli_stabilization.py +99 -0
- contractforge_databricks-0.2.0/src/contractforge_databricks/cli_standard.py +83 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/bronze.py +5 -5
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/gold.py +7 -7
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/silver.py +14 -14
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/bundles.py +2 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/sources.py +16 -6
- contractforge_databricks-0.1.0/CHANGELOG.md +0 -15
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/README.md +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/adapter.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/application.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/audit.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/api.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/assets.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/project.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/project_config.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/builders.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/evaluate.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/mapping.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/models.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/runtime.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/uc.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_governance.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_io.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_maintenance.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/coercion.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/contract_extensions.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/model.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/report.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/dashboards/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/dashboards/control_tables.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/diagnostics/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/diagnostics/explain.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/environment.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/ddl.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/governance_log.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/helpers.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/ops_log.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/records.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/run_log.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/schemas.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/tables.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/writer.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/delta_basic.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/hash_diff.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/hash_diff_latest.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/replace_partitions.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/results.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/retry.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2_deletes.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2_late.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/snapshot.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/sql_merge.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/tables.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/windows.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/access.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/application.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/drift.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/runtime.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/validation.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/compatibility.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/rendering.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lineage/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lineage/openlineage.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/retention.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/history.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/write.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/application.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/catalog.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/models.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/scenarios.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/partitioning/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/partitioning/predicates.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/deduplicate.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/encoding.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/hashing.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/pyspark.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/pyspark_staging.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/shape.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/shape_validation.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/staging.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/zip_arrays.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/base.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/catalog.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/core.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/modifiers.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/runtime.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/write_engine.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/evaluation.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/persistence.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/registry.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/results.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/bundle.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/markdown.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/names.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/results.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/available_now.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/cache.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/control_tables.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/deploy.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/detection.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/dry_run.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/errors.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/file_selection.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/finalization.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/governance.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/hooks.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_file.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_retry.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_safety.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/json_materialization.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/lineage.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/maintenance.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/merge_validation.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/metadata.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/metrics.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/models.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/options.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/orchestration_context.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/orchestrator.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/partitioning.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/quality_quarantine.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_api.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_auth.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_pagination.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/run_payload.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/schema.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_metadata.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_registry.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_schema.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/spark.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/spark_defaults.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/storage_auth.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/streaming.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/success.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/utils.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/watermark.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/windows.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write_flow.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write_strategy.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/diff.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/policy.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/sync.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/errors.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/redaction.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/secrets.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/source_policy.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/shapes/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/shapes/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/artifacts.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/autoloader.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/bounded_streams.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/classification.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/delta_share.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/files.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/http_file.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/interpret.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/jdbc.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/metadata.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/native_passthrough.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rds_iam.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rds_iam_runtime.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rest_api.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/support.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/table_refs.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/identifiers.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/literals.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/ddl.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/migrations.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/queries.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/tables.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/writer.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/catalog.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/catalog_parity.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/core.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/enrichment.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/transforms/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/transforms/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/watermark/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/watermark/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/__init__.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/registry.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/sql.py +0 -0
- {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/strategy.py +0 -0
|
@@ -8,6 +8,7 @@ __pycache__/
|
|
|
8
8
|
.tmp/
|
|
9
9
|
dist/
|
|
10
10
|
build/
|
|
11
|
+
test-runs/
|
|
11
12
|
*.egg
|
|
12
13
|
.coverage
|
|
13
14
|
.coverage.*
|
|
@@ -16,3 +17,13 @@ htmlcov/
|
|
|
16
17
|
.env
|
|
17
18
|
.env.*
|
|
18
19
|
!.env.example
|
|
20
|
+
api-key-*.txt
|
|
21
|
+
|
|
22
|
+
# Local agent/tooling state; never publish these.
|
|
23
|
+
.claude/
|
|
24
|
+
.codex/
|
|
25
|
+
.agents/
|
|
26
|
+
.vscode/
|
|
27
|
+
AGENTS.md
|
|
28
|
+
RTK.md
|
|
29
|
+
tools/rtk.ps1
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `contractforge-databricks` are documented in this file.
|
|
4
|
+
|
|
5
|
+
The format follows Keep a Changelog, and this package follows semantic
|
|
6
|
+
versioning as described in `../../docs/specs/api-stability.md`.
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-06-19
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- Added `contractforge-databricks stabilization-report` with
|
|
13
|
+
`STABLE_SUPPORTED_SURFACE` and `stable_final=true` for the documented
|
|
14
|
+
serverless Delta surface.
|
|
15
|
+
- Added a Databricks stable-surface evidence manifest under `docs/reports`.
|
|
16
|
+
- Added release metadata for the current stable Databricks adapter baseline.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Aligned the adapter dependency range with `contractforge-core` 0.2.x.
|
|
21
|
+
- Documented the validated contract-only execution model for Databricks-native
|
|
22
|
+
jobs and serverless-oriented runtime guidance.
|
|
23
|
+
|
|
24
|
+
## [0.1.0] - 2026-06-08
|
|
25
|
+
|
|
26
|
+
### Added
|
|
27
|
+
|
|
28
|
+
- Initial public alpha release of the Databricks adapter.
|
|
29
|
+
- Databricks contract planning, SQL/artifact rendering, Asset Bundle support,
|
|
30
|
+
runtime helpers, governance, quality, evidence, lineage and operational
|
|
31
|
+
cost surfaces.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: contractforge-databricks
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.2.0
|
|
4
4
|
Summary: Databricks adapter for ContractForge Core.
|
|
5
|
-
Project-URL: Homepage, https://github.com/marquesantero/contractforge
|
|
6
|
-
Project-URL: Documentation, https://marquesantero.github.io/contractforge
|
|
7
|
-
Project-URL: Repository, https://github.com/marquesantero/contractforge
|
|
8
|
-
Project-URL: Issues, https://github.com/marquesantero/contractforge
|
|
9
|
-
Project-URL: Changelog, https://github.com/marquesantero/contractforge
|
|
5
|
+
Project-URL: Homepage, https://github.com/marquesantero/contractforge/tree/main/adapters/databricks
|
|
6
|
+
Project-URL: Documentation, https://marquesantero.github.io/contractforge/docs/adapters/databricks
|
|
7
|
+
Project-URL: Repository, https://github.com/marquesantero/contractforge
|
|
8
|
+
Project-URL: Issues, https://github.com/marquesantero/contractforge/issues
|
|
9
|
+
Project-URL: Changelog, https://github.com/marquesantero/contractforge/blob/main/adapters/databricks/CHANGELOG.md
|
|
10
10
|
Author: ContractForge contributors
|
|
11
11
|
License: MIT
|
|
12
12
|
Keywords: contractforge,data-contracts,databricks,ingestion,lakehouse
|
|
@@ -21,7 +21,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
21
21
|
Classifier: Topic :: Database
|
|
22
22
|
Classifier: Topic :: Software Development :: Libraries
|
|
23
23
|
Requires-Python: >=3.10
|
|
24
|
-
Requires-Dist: contractforge-core<0.
|
|
24
|
+
Requires-Dist: contractforge-core<0.3,>=0.2
|
|
25
25
|
Provides-Extra: dev
|
|
26
26
|
Requires-Dist: pytest>=8; extra == 'dev'
|
|
27
27
|
Description-Content-Type: text/markdown
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "contractforge-databricks"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.2.0"
|
|
8
8
|
description = "Databricks adapter for ContractForge Core."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -23,14 +23,14 @@ classifiers = [
|
|
|
23
23
|
"Topic :: Database",
|
|
24
24
|
"Topic :: Software Development :: Libraries",
|
|
25
25
|
]
|
|
26
|
-
dependencies = ["contractforge-core>=0.
|
|
26
|
+
dependencies = ["contractforge-core>=0.2,<0.3"]
|
|
27
27
|
|
|
28
28
|
[project.urls]
|
|
29
|
-
Homepage = "https://github.com/marquesantero/contractforge
|
|
30
|
-
Documentation = "https://marquesantero.github.io/contractforge
|
|
31
|
-
Repository = "https://github.com/marquesantero/contractforge
|
|
32
|
-
Issues = "https://github.com/marquesantero/contractforge
|
|
33
|
-
Changelog = "https://github.com/marquesantero/contractforge
|
|
29
|
+
Homepage = "https://github.com/marquesantero/contractforge/tree/main/adapters/databricks"
|
|
30
|
+
Documentation = "https://marquesantero.github.io/contractforge/docs/adapters/databricks"
|
|
31
|
+
Repository = "https://github.com/marquesantero/contractforge"
|
|
32
|
+
Issues = "https://github.com/marquesantero/contractforge/issues"
|
|
33
|
+
Changelog = "https://github.com/marquesantero/contractforge/blob/main/adapters/databricks/CHANGELOG.md"
|
|
34
34
|
|
|
35
35
|
[project.optional-dependencies]
|
|
36
36
|
dev = ["pytest>=8"]
|
|
@@ -13,6 +13,8 @@ from contractforge_databricks.cli_deploy import add_deploy_parser, deploy_comman
|
|
|
13
13
|
from contractforge_databricks.cli_governance import add_governance_parser, governance_command
|
|
14
14
|
from contractforge_databricks.cli_io import load_contract_input, load_mapping, write_artifacts, write_mapping
|
|
15
15
|
from contractforge_databricks.cli_maintenance import add_maintenance_parser, maintenance_command
|
|
16
|
+
from contractforge_databricks.cli_stabilization import add_stabilization_parser, handle_stabilization
|
|
17
|
+
from contractforge_databricks.cli_standard import add_standard_parser, standard_command
|
|
16
18
|
from contractforge_databricks.dashboards import render_control_dashboard_artifacts
|
|
17
19
|
from contractforge_databricks.presets import list_presets, preset_details
|
|
18
20
|
from contractforge_databricks.templates import (
|
|
@@ -73,9 +75,11 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
73
75
|
dashboard.add_argument("--output-dir", type=Path)
|
|
74
76
|
dashboard.add_argument("--indent", type=int, default=2)
|
|
75
77
|
|
|
78
|
+
add_standard_parser(sub)
|
|
76
79
|
add_governance_parser(sub)
|
|
77
80
|
add_maintenance_parser(sub)
|
|
78
81
|
add_deploy_parser(sub)
|
|
82
|
+
add_stabilization_parser(sub)
|
|
79
83
|
|
|
80
84
|
return parser
|
|
81
85
|
|
|
@@ -99,6 +103,12 @@ def _dispatch(args: argparse.Namespace) -> int:
|
|
|
99
103
|
return _render_contract(args)
|
|
100
104
|
if args.command == "dashboard":
|
|
101
105
|
return _dashboard(args)
|
|
106
|
+
standard_result = standard_command(args)
|
|
107
|
+
if standard_result is not None:
|
|
108
|
+
return standard_result
|
|
109
|
+
stabilization_result = handle_stabilization(args)
|
|
110
|
+
if stabilization_result is not None:
|
|
111
|
+
return stabilization_result
|
|
102
112
|
governance_result = governance_command(args)
|
|
103
113
|
if governance_result is not None:
|
|
104
114
|
return governance_result
|
|
@@ -21,6 +21,12 @@ def add_deploy_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentPa
|
|
|
21
21
|
project.add_argument("--force-render", action="store_true", help="Overwrite the rendered bundle when --render-bundle is used.")
|
|
22
22
|
_add_common_deploy_args(project)
|
|
23
23
|
|
|
24
|
+
run_project = subparsers.add_parser("run-project", help="Deploy and run a project Databricks Asset Bundle.")
|
|
25
|
+
run_project.add_argument("project", type=Path)
|
|
26
|
+
run_project.add_argument("--render-bundle", action="store_true", help="Render databricks.yml from project.yaml before deployment.")
|
|
27
|
+
run_project.add_argument("--force-render", action="store_true", help="Overwrite the rendered bundle when --render-bundle is used.")
|
|
28
|
+
_add_common_deploy_args(run_project, include_run=False)
|
|
29
|
+
|
|
24
30
|
bundle = subparsers.add_parser("deploy-bundle", help="Validate/deploy/run a Databricks Asset Bundle directory.")
|
|
25
31
|
bundle.add_argument("bundle", type=Path)
|
|
26
32
|
_add_common_deploy_args(bundle)
|
|
@@ -53,6 +59,21 @@ def _handle_project(args: argparse.Namespace) -> int:
|
|
|
53
59
|
)
|
|
54
60
|
|
|
55
61
|
|
|
62
|
+
def _handle_run_project(args: argparse.Namespace) -> int:
|
|
63
|
+
return _print(
|
|
64
|
+
deploy_databricks_project(
|
|
65
|
+
args.project,
|
|
66
|
+
profile=args.profile,
|
|
67
|
+
target=args.target,
|
|
68
|
+
run=True,
|
|
69
|
+
validate=not args.skip_validate,
|
|
70
|
+
render_bundle=args.render_bundle,
|
|
71
|
+
force_render=args.force_render,
|
|
72
|
+
),
|
|
73
|
+
args.indent,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
|
|
56
77
|
def _handle_bundle(args: argparse.Namespace) -> int:
|
|
57
78
|
return _print(
|
|
58
79
|
deploy_databricks_bundle(
|
|
@@ -78,10 +99,11 @@ def _handle_render_project_bundle(args: argparse.Namespace) -> int:
|
|
|
78
99
|
)
|
|
79
100
|
|
|
80
101
|
|
|
81
|
-
def _add_common_deploy_args(parser: argparse.ArgumentParser) -> None:
|
|
102
|
+
def _add_common_deploy_args(parser: argparse.ArgumentParser, *, include_run: bool = True) -> None:
|
|
82
103
|
parser.add_argument("--profile")
|
|
83
104
|
parser.add_argument("--target")
|
|
84
|
-
|
|
105
|
+
if include_run:
|
|
106
|
+
parser.add_argument("--run", action="store_true", help="Run the deployed bundle job after deployment.")
|
|
85
107
|
parser.add_argument("--skip-validate", action="store_true")
|
|
86
108
|
parser.add_argument("--indent", type=int, default=2)
|
|
87
109
|
|
|
@@ -93,6 +115,7 @@ def _print(payload: object, indent: int) -> int:
|
|
|
93
115
|
|
|
94
116
|
_COMMANDS: dict[str, Callable[[argparse.Namespace], int]] = {
|
|
95
117
|
"deploy-project": _handle_project,
|
|
118
|
+
"run-project": _handle_run_project,
|
|
96
119
|
"deploy-bundle": _handle_bundle,
|
|
97
120
|
"render-project-bundle": _handle_render_project_bundle,
|
|
98
121
|
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Databricks stabilization status reporting."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
from typing import Any
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def add_stabilization_parser(subcommands: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
11
|
+
report = subcommands.add_parser(
|
|
12
|
+
"stabilization-report",
|
|
13
|
+
help="Print the Databricks adapter stabilization status for the supported v0.2.0 surface.",
|
|
14
|
+
)
|
|
15
|
+
report.add_argument(
|
|
16
|
+
"--strict-final",
|
|
17
|
+
action="store_true",
|
|
18
|
+
help="Return a non-zero exit code while the documented stable-final claim is not satisfied.",
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def handle_stabilization(args: argparse.Namespace) -> int | None:
|
|
23
|
+
if args.command != "stabilization-report":
|
|
24
|
+
return None
|
|
25
|
+
payload = databricks_stabilization_report()
|
|
26
|
+
print(json.dumps(payload, indent=2, sort_keys=True))
|
|
27
|
+
if args.strict_final and payload["stable_final"] is not True:
|
|
28
|
+
return 1
|
|
29
|
+
return 0
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def databricks_stabilization_report() -> dict[str, Any]:
|
|
33
|
+
"""Return the current Databricks adapter stabilization decision.
|
|
34
|
+
|
|
35
|
+
``supported_surface_ready`` covers the documented serverless Delta,
|
|
36
|
+
Unity Catalog, evidence and contract-runtime available-now surface.
|
|
37
|
+
``stable_final`` is true for that scoped claim because full 1.0 GA,
|
|
38
|
+
continuous streaming and broader provider matrices are separate gates.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
return {
|
|
42
|
+
"adapter": "contractforge-databricks",
|
|
43
|
+
"subtarget": "databricks_serverless_delta",
|
|
44
|
+
"classification": "STABLE_SUPPORTED_SURFACE",
|
|
45
|
+
"supported_surface_ready": True,
|
|
46
|
+
"stable_final": True,
|
|
47
|
+
"release_candidate": "next-databricks-stable-surface",
|
|
48
|
+
"gates": _gates(),
|
|
49
|
+
"real_validation_projects": _real_validation_projects(),
|
|
50
|
+
"accepted_review_boundaries": _accepted_review_boundaries(),
|
|
51
|
+
"next_promotion_gates": [],
|
|
52
|
+
"stability_criteria": "docs/specs/databricks-ga-criteria.md",
|
|
53
|
+
"waiver_registry": "docs/specs/databricks-ga-waivers.md",
|
|
54
|
+
"evidence_manifest": "docs/reports/databricks-stable-surface-evidence.json",
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _gates() -> list[dict[str, str]]:
|
|
59
|
+
return [
|
|
60
|
+
{"id": "G0", "name": "local suite", "status": "PASS"},
|
|
61
|
+
{"id": "G1", "name": "render and bundle artifacts", "status": "PASS"},
|
|
62
|
+
{"id": "G2", "name": "runtime orchestration", "status": "PASS"},
|
|
63
|
+
{"id": "G3", "name": "governance artifacts", "status": "PASS"},
|
|
64
|
+
{"id": "G4", "name": "evidence and state tables", "status": "PASS"},
|
|
65
|
+
{"id": "G5", "name": "available-now contract runtime", "status": "PASS"},
|
|
66
|
+
{"id": "G6", "name": "platform parity", "status": "PASS_WITH_REVIEW_BOUNDARIES"},
|
|
67
|
+
{"id": "G7", "name": "docs", "status": "PASS"},
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _real_validation_projects() -> list[dict[str, str]]:
|
|
72
|
+
return [
|
|
73
|
+
{"name": "databricks_reference_runtime_suite", "status": "PASS"},
|
|
74
|
+
{"name": "databricks_same_contract_e2e", "status": "PASS"},
|
|
75
|
+
{"name": "databricks_confluent_kafka_available_now", "status": "PASS"},
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def _accepted_review_boundaries() -> list[dict[str, str]]:
|
|
80
|
+
return [
|
|
81
|
+
{
|
|
82
|
+
"code": "DATABRICKS_FULL_GA_GATE",
|
|
83
|
+
"area": "1.0.0 general availability",
|
|
84
|
+
"decision": "EXCLUDED_FROM_STABLE_FINAL",
|
|
85
|
+
"reason": "The stable-final claim covers the documented v0.2.0 serverless Delta surface. The broader 1.0 GA gate remains governed by the Databricks GA criteria.",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"code": "DATABRICKS_CONTINUOUS_STREAMING_REVIEW",
|
|
89
|
+
"area": "continuous streaming",
|
|
90
|
+
"decision": "EXCLUDED_FROM_STABLE_FINAL",
|
|
91
|
+
"reason": "The stable stream claim covers checkpointed available-now contract runtime. Unbounded continuous streaming remains outside stable-final.",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"code": "DATABRICKS_PROVIDER_MATRIX_REVIEW",
|
|
95
|
+
"area": "Kafka provider compatibility beyond validated Confluent Cloud",
|
|
96
|
+
"decision": "EXCLUDED_FROM_STABLE_FINAL",
|
|
97
|
+
"reason": "Confluent Cloud available-now contract runtime is validated. Additional Kafka-compatible providers require separate certification before provider-equivalence claims.",
|
|
98
|
+
},
|
|
99
|
+
]
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"""Canonical Databricks adapter CLI commands."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import argparse
|
|
6
|
+
import json
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from contractforge_databricks.api import plan_databricks_contract
|
|
10
|
+
from contractforge_databricks.cli_io import load_contract_input, load_mapping
|
|
11
|
+
from contractforge_databricks.cost import CostModel, build_operational_cost_report
|
|
12
|
+
from contractforge_databricks.sources import list_databricks_source_support
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def add_standard_parser(subparsers: argparse._SubParsersAction[argparse.ArgumentParser]) -> None:
|
|
16
|
+
plan = subparsers.add_parser("plan", help="Plan a contract against the Databricks target")
|
|
17
|
+
plan.add_argument("contract", type=Path)
|
|
18
|
+
plan.add_argument("--environment", type=Path)
|
|
19
|
+
plan.add_argument("--indent", type=int, default=2)
|
|
20
|
+
|
|
21
|
+
cost = subparsers.add_parser("cost-report", help="Render a query-only Databricks operational cost report")
|
|
22
|
+
cost.add_argument("--catalog", default="main")
|
|
23
|
+
cost.add_argument("--schema", default="ops")
|
|
24
|
+
cost.add_argument("--lookback-days", type=int, default=30)
|
|
25
|
+
cost.add_argument("--group-by", action="append")
|
|
26
|
+
cost.add_argument("--dbu-per-hour", type=float)
|
|
27
|
+
cost.add_argument("--currency-per-dbu", type=float)
|
|
28
|
+
cost.add_argument("--currency", default="USD")
|
|
29
|
+
cost.add_argument("--success-only", action="store_true")
|
|
30
|
+
cost.add_argument("--limit", type=int, default=100)
|
|
31
|
+
cost.add_argument("--indent", type=int, default=2)
|
|
32
|
+
|
|
33
|
+
subparsers.add_parser("sources", help="Print Databricks source support metadata")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def standard_command(args: argparse.Namespace) -> int | None:
|
|
37
|
+
if args.command == "plan":
|
|
38
|
+
return _plan_contract(args)
|
|
39
|
+
if args.command == "cost-report":
|
|
40
|
+
return _cost_report(args)
|
|
41
|
+
if args.command == "sources":
|
|
42
|
+
print(json.dumps(list(list_databricks_source_support()), indent=2, sort_keys=True, default=str))
|
|
43
|
+
return 0
|
|
44
|
+
return None
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _plan_contract(args: argparse.Namespace) -> int:
|
|
48
|
+
contract, bundle_environment = load_contract_input(args.contract)
|
|
49
|
+
environment = load_mapping(args.environment) if args.environment else bundle_environment
|
|
50
|
+
result = plan_databricks_contract(contract, environment=environment)
|
|
51
|
+
payload = {
|
|
52
|
+
"status": result.status,
|
|
53
|
+
"blockers": [{"code": item.code, "message": item.message} for item in result.blockers],
|
|
54
|
+
"warnings": [{"code": item.code, "message": item.message} for item in result.warnings],
|
|
55
|
+
"plan": None
|
|
56
|
+
if result.plan is None
|
|
57
|
+
else {
|
|
58
|
+
"platform": result.plan.platform,
|
|
59
|
+
"evidence_required": result.plan.evidence_required,
|
|
60
|
+
"steps": [{"name": step.name, "intent": step.intent} for step in result.plan.steps],
|
|
61
|
+
},
|
|
62
|
+
}
|
|
63
|
+
print(json.dumps(payload, indent=args.indent, sort_keys=True, default=str))
|
|
64
|
+
return 0
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _cost_report(args: argparse.Namespace) -> int:
|
|
68
|
+
report = build_operational_cost_report(
|
|
69
|
+
catalog=args.catalog,
|
|
70
|
+
schema=args.schema,
|
|
71
|
+
lookback_days=args.lookback_days,
|
|
72
|
+
group_by=tuple(args.group_by or ("target_table", "mode", "status")),
|
|
73
|
+
cost_model=CostModel(
|
|
74
|
+
dbu_per_hour=args.dbu_per_hour,
|
|
75
|
+
currency_per_dbu=args.currency_per_dbu,
|
|
76
|
+
currency=args.currency,
|
|
77
|
+
),
|
|
78
|
+
include_failed=not args.success_only,
|
|
79
|
+
query_only=True,
|
|
80
|
+
limit=args.limit,
|
|
81
|
+
)
|
|
82
|
+
print(json.dumps(report, indent=args.indent, sort_keys=True, default=str))
|
|
83
|
+
return 0
|
|
@@ -8,14 +8,14 @@ BRONZE_PRESETS: dict[str, Preset] = {
|
|
|
8
8
|
"bronze_file_append": {
|
|
9
9
|
PRESET_META_KEY: meta("bronze_file_append", "bronze", "ingestion", "Bronze append for batch files."),
|
|
10
10
|
"layer": "bronze",
|
|
11
|
-
"mode": "
|
|
11
|
+
"mode": "append",
|
|
12
12
|
"schema_policy": "additive_only",
|
|
13
13
|
"on_quality_fail": "fail",
|
|
14
14
|
},
|
|
15
15
|
"bronze_table_append": {
|
|
16
16
|
PRESET_META_KEY: meta("bronze_table_append", "bronze", "ingestion", "Bronze append for table replication."),
|
|
17
17
|
"layer": "bronze",
|
|
18
|
-
"mode": "
|
|
18
|
+
"mode": "append",
|
|
19
19
|
"schema_policy": "additive_only",
|
|
20
20
|
"on_quality_fail": "fail",
|
|
21
21
|
},
|
|
@@ -29,7 +29,7 @@ BRONZE_PRESETS: dict[str, Preset] = {
|
|
|
29
29
|
),
|
|
30
30
|
"source": {"type": "incremental_files", "trigger": "available_now", "format": "parquet"},
|
|
31
31
|
"layer": "bronze",
|
|
32
|
-
"mode": "
|
|
32
|
+
"mode": "append",
|
|
33
33
|
"schema_policy": "additive_only",
|
|
34
34
|
"on_quality_fail": "fail",
|
|
35
35
|
"idempotency_policy": "skip_if_success",
|
|
@@ -37,7 +37,7 @@ BRONZE_PRESETS: dict[str, Preset] = {
|
|
|
37
37
|
"bronze_full_overwrite": {
|
|
38
38
|
PRESET_META_KEY: meta("bronze_full_overwrite", "bronze", "ingestion", "Bronze full snapshot overwrite."),
|
|
39
39
|
"layer": "bronze",
|
|
40
|
-
"mode": "
|
|
40
|
+
"mode": "overwrite",
|
|
41
41
|
"schema_policy": "additive_only",
|
|
42
42
|
"on_quality_fail": "fail",
|
|
43
43
|
},
|
|
@@ -50,7 +50,7 @@ BRONZE_PRESETS: dict[str, Preset] = {
|
|
|
50
50
|
["extensions.databricks.partition_column", "extensions.databricks.partition_value"],
|
|
51
51
|
),
|
|
52
52
|
"layer": "bronze",
|
|
53
|
-
"mode": "
|
|
53
|
+
"mode": "overwrite",
|
|
54
54
|
"schema_policy": "additive_only",
|
|
55
55
|
"on_quality_fail": "fail",
|
|
56
56
|
},
|
|
@@ -8,7 +8,7 @@ GOLD_PRESETS: dict[str, Preset] = {
|
|
|
8
8
|
"gold_full_refresh": {
|
|
9
9
|
PRESET_META_KEY: meta("gold_full_refresh", "gold", "ingestion", "Gold full refresh."),
|
|
10
10
|
"layer": "gold",
|
|
11
|
-
"mode": "
|
|
11
|
+
"mode": "overwrite",
|
|
12
12
|
"schema_policy": "strict",
|
|
13
13
|
"on_quality_fail": "fail",
|
|
14
14
|
},
|
|
@@ -21,7 +21,7 @@ GOLD_PRESETS: dict[str, Preset] = {
|
|
|
21
21
|
["extensions.databricks.partition_column", "extensions.databricks.partition_value"],
|
|
22
22
|
),
|
|
23
23
|
"layer": "gold",
|
|
24
|
-
"mode": "
|
|
24
|
+
"mode": "overwrite",
|
|
25
25
|
"schema_policy": "strict",
|
|
26
26
|
"on_quality_fail": "fail",
|
|
27
27
|
},
|
|
@@ -34,7 +34,7 @@ GOLD_PRESETS: dict[str, Preset] = {
|
|
|
34
34
|
["extensions.databricks.merge_partition_column"],
|
|
35
35
|
),
|
|
36
36
|
"layer": "gold",
|
|
37
|
-
"mode": "
|
|
37
|
+
"mode": "upsert",
|
|
38
38
|
"extensions": {
|
|
39
39
|
"databricks": {
|
|
40
40
|
"merge_strategy": "replace_partitions",
|
|
@@ -47,14 +47,14 @@ GOLD_PRESETS: dict[str, Preset] = {
|
|
|
47
47
|
"gold_snapshot_serving": {
|
|
48
48
|
PRESET_META_KEY: meta("gold_snapshot_serving", "gold", "ingestion", "Gold snapshot serving.", ["merge_keys"]),
|
|
49
49
|
"layer": "gold",
|
|
50
|
-
"mode": "
|
|
50
|
+
"mode": "snapshot_reconcile_soft_delete",
|
|
51
51
|
"schema_policy": "strict",
|
|
52
52
|
"on_quality_fail": "fail",
|
|
53
53
|
},
|
|
54
|
-
"
|
|
55
|
-
PRESET_META_KEY: meta("
|
|
54
|
+
"gold_current_state_serving": {
|
|
55
|
+
PRESET_META_KEY: meta("gold_current_state_serving", "gold", "ingestion", "Gold current-state serving.", ["merge_keys"]),
|
|
56
56
|
"layer": "gold",
|
|
57
|
-
"mode": "
|
|
57
|
+
"mode": "upsert",
|
|
58
58
|
"extensions": {"databricks": {"merge_strategy": "delta"}},
|
|
59
59
|
"schema_policy": "strict",
|
|
60
60
|
"on_quality_fail": "fail",
|
|
@@ -6,9 +6,9 @@ from contractforge_databricks.presets.base import PRESET_META_KEY, Preset, meta
|
|
|
6
6
|
|
|
7
7
|
SILVER_PRESETS: dict[str, Preset] = {
|
|
8
8
|
"silver_scd1_upsert": {
|
|
9
|
-
PRESET_META_KEY: meta("silver_scd1_upsert", "silver", "ingestion", "Silver
|
|
9
|
+
PRESET_META_KEY: meta("silver_scd1_upsert", "silver", "ingestion", "Silver current-state Delta MERGE.", ["merge_keys"]),
|
|
10
10
|
"layer": "silver",
|
|
11
|
-
"mode": "
|
|
11
|
+
"mode": "upsert",
|
|
12
12
|
"extensions": {"databricks": {"merge_strategy": "delta"}},
|
|
13
13
|
"schema_policy": "additive_only",
|
|
14
14
|
"on_quality_fail": "fail",
|
|
@@ -18,11 +18,11 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
18
18
|
"silver_scd1_partition_upsert",
|
|
19
19
|
"silver",
|
|
20
20
|
"ingestion",
|
|
21
|
-
"Silver
|
|
21
|
+
"Silver current-state MERGE pruned by partition.",
|
|
22
22
|
["merge_keys", "extensions.databricks.merge_partition_column"],
|
|
23
23
|
),
|
|
24
24
|
"layer": "silver",
|
|
25
|
-
"mode": "
|
|
25
|
+
"mode": "upsert",
|
|
26
26
|
"extensions": {"databricks": {"merge_strategy": "delta_by_partition"}},
|
|
27
27
|
"schema_policy": "additive_only",
|
|
28
28
|
"on_quality_fail": "fail",
|
|
@@ -36,7 +36,7 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
36
36
|
["extensions.databricks.merge_partition_column"],
|
|
37
37
|
),
|
|
38
38
|
"layer": "silver",
|
|
39
|
-
"mode": "
|
|
39
|
+
"mode": "upsert",
|
|
40
40
|
"extensions": {
|
|
41
41
|
"databricks": {
|
|
42
42
|
"merge_strategy": "replace_partitions",
|
|
@@ -51,11 +51,11 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
51
51
|
"silver_incremental_watermark_upsert",
|
|
52
52
|
"silver",
|
|
53
53
|
"ingestion",
|
|
54
|
-
"Silver
|
|
54
|
+
"Silver current-state incremental watermark upsert.",
|
|
55
55
|
["merge_keys", "watermark_columns"],
|
|
56
56
|
),
|
|
57
57
|
"layer": "silver",
|
|
58
|
-
"mode": "
|
|
58
|
+
"mode": "upsert",
|
|
59
59
|
"extensions": {"databricks": {"merge_strategy": "delta"}},
|
|
60
60
|
"schema_policy": "additive_only",
|
|
61
61
|
"on_quality_fail": "fail",
|
|
@@ -63,7 +63,7 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
63
63
|
"silver_hash_diff_append": {
|
|
64
64
|
PRESET_META_KEY: meta("silver_hash_diff_append", "silver", "ingestion", "Silver hash-diff append.", ["hash_keys"]),
|
|
65
65
|
"layer": "silver",
|
|
66
|
-
"mode": "
|
|
66
|
+
"mode": "hash_diff_upsert",
|
|
67
67
|
"schema_policy": "additive_only",
|
|
68
68
|
"on_quality_fail": "fail",
|
|
69
69
|
"hash_exclude_columns": ["ingestion_ts_utc", "__run_id"],
|
|
@@ -73,11 +73,11 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
73
73
|
"silver_quarantine_ingestion",
|
|
74
74
|
"silver",
|
|
75
75
|
"ingestion",
|
|
76
|
-
"Silver
|
|
76
|
+
"Silver current-state merge with quarantine for row-level rules.",
|
|
77
77
|
["merge_keys"],
|
|
78
78
|
),
|
|
79
79
|
"layer": "silver",
|
|
80
|
-
"mode": "
|
|
80
|
+
"mode": "upsert",
|
|
81
81
|
"extensions": {"databricks": {"merge_strategy": "delta"}},
|
|
82
82
|
"schema_policy": "additive_only",
|
|
83
83
|
"on_quality_fail": "quarantine",
|
|
@@ -87,14 +87,14 @@ SILVER_PRESETS: dict[str, Preset] = {
|
|
|
87
87
|
"silver_snapshot_soft_delete", "silver", "ingestion", "Silver snapshot soft delete.", ["merge_keys"]
|
|
88
88
|
),
|
|
89
89
|
"layer": "silver",
|
|
90
|
-
"mode": "
|
|
90
|
+
"mode": "snapshot_reconcile_soft_delete",
|
|
91
91
|
"schema_policy": "additive_only",
|
|
92
92
|
"on_quality_fail": "fail",
|
|
93
93
|
},
|
|
94
|
-
"
|
|
95
|
-
PRESET_META_KEY: meta("
|
|
94
|
+
"silver_historical": {
|
|
95
|
+
PRESET_META_KEY: meta("silver_historical", "silver", "ingestion", "Silver historical versioning.", ["merge_keys"]),
|
|
96
96
|
"layer": "silver",
|
|
97
|
-
"mode": "
|
|
97
|
+
"mode": "historical",
|
|
98
98
|
"schema_policy": "additive_only",
|
|
99
99
|
"on_quality_fail": "fail",
|
|
100
100
|
},
|
|
@@ -26,6 +26,7 @@ from contractforge_databricks.runtime.options import effective_ingest_options
|
|
|
26
26
|
from contractforge_databricks.runtime.orchestrator import ingest_databricks_contract
|
|
27
27
|
from contractforge_databricks.runtime.quality_quarantine import apply_declared_quality, with_run_id
|
|
28
28
|
from contractforge_databricks.runtime.spark_defaults import spark_query_one, with_spark_runtime_defaults
|
|
29
|
+
from contractforge_databricks.runtime.source_metadata import schema_types
|
|
29
30
|
from contractforge_databricks.runtime.sources import prepare_contract_source_view
|
|
30
31
|
from contractforge_databricks.runtime.windows import has_windowed_execution, ingest_windowed_databricks_contract
|
|
31
32
|
|
|
@@ -181,6 +182,7 @@ def _prepare_available_now_batch(
|
|
|
181
182
|
prepared,
|
|
182
183
|
source_view=prepared_view,
|
|
183
184
|
source_columns=tuple(str(column) for column in getattr(df, "columns", ()) or ()),
|
|
185
|
+
source_schema=schema_types(df),
|
|
184
186
|
rows_read=int(df.count()) if collect_metrics else prepared.rows_read,
|
|
185
187
|
)
|
|
186
188
|
|
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
"""Databricks runtime source resolution.
|
|
2
|
-
|
|
3
|
-
The functions in this module intentionally receive ``spark`` as an argument so
|
|
4
|
-
the adapter stays importable outside Databricks and PySpark remains optional.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
1
|
from __future__ import annotations
|
|
8
2
|
|
|
9
3
|
from typing import Any
|
|
@@ -53,6 +47,8 @@ from contractforge_databricks.sources.table_refs import (
|
|
|
53
47
|
)
|
|
54
48
|
|
|
55
49
|
_JDBC_SOURCE_ALIASES = {"jdbc", "postgres", "mysql", "sqlserver", "oracle", "redshift", "db2", "mariadb", "snowflake_jdbc", "bigquery_jdbc"}
|
|
50
|
+
_KAFKA_LOGIN_MODULE = "org.apache.kafka.common.security.plain.PlainLoginModule"
|
|
51
|
+
_DATABRICKS_SHADED_KAFKA_LOGIN_MODULE = "kafkashaded.org.apache.kafka.common.security.plain.PlainLoginModule"
|
|
56
52
|
|
|
57
53
|
|
|
58
54
|
def resolve_source_dataframe(spark: Any, source: dict[str, Any], *, contract: SemanticContract | None = None) -> Any:
|
|
@@ -91,6 +87,8 @@ def resolve_source_dataframe(spark: Any, source: dict[str, Any], *, contract: Se
|
|
|
91
87
|
return _read_with_options(spark.read, "jdbc", jdbc_options, None)
|
|
92
88
|
if is_bounded_stream_source(source) or is_available_now_stream_source(source):
|
|
93
89
|
options = kafka_bounded_options(source) if is_kafka_stream_source(source) else eventhubs_bounded_options(source)
|
|
90
|
+
if is_kafka_stream_source(source):
|
|
91
|
+
options = _databricks_kafka_options(options)
|
|
94
92
|
source_format = stream_source_format(source)
|
|
95
93
|
reader = spark.readStream if is_available_now_stream_source(source) else spark.read
|
|
96
94
|
return _read_with_options(reader, source_format, options, None)
|
|
@@ -187,6 +185,18 @@ def _resolve_autoloader_source(spark: Any, source: dict[str, Any]) -> Any:
|
|
|
187
185
|
return _read_with_options(spark.readStream, "cloudFiles", options, interpreted.get("path"))
|
|
188
186
|
|
|
189
187
|
|
|
188
|
+
def _databricks_kafka_options(options: dict[str, str]) -> dict[str, str]:
|
|
189
|
+
normalized = dict(options)
|
|
190
|
+
jaas_config = normalized.get("kafka.sasl.jaas.config")
|
|
191
|
+
if jaas_config:
|
|
192
|
+
normalized["kafka.sasl.jaas.config"] = " ".join(
|
|
193
|
+
str(jaas_config)
|
|
194
|
+
.replace(_KAFKA_LOGIN_MODULE, _DATABRICKS_SHADED_KAFKA_LOGIN_MODULE)
|
|
195
|
+
.splitlines()
|
|
196
|
+
).strip()
|
|
197
|
+
return normalized
|
|
198
|
+
|
|
199
|
+
|
|
190
200
|
def _read_with_options(reader: Any, source_format: str, options: dict[str, str], path: object | None) -> Any:
|
|
191
201
|
builder = reader.format(source_format)
|
|
192
202
|
for key, value in sorted(options.items()):
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to `contractforge-databricks` are documented in this file.
|
|
4
|
-
|
|
5
|
-
The format follows Keep a Changelog, and this package follows semantic
|
|
6
|
-
versioning as described in `../../docs/specs/api-stability.md`.
|
|
7
|
-
|
|
8
|
-
## [0.1.0] - 2026-06-08
|
|
9
|
-
|
|
10
|
-
### Added
|
|
11
|
-
|
|
12
|
-
- Initial public alpha release of the Databricks adapter.
|
|
13
|
-
- Databricks contract planning, SQL/artifact rendering, Asset Bundle support,
|
|
14
|
-
runtime helpers, governance, quality, evidence, lineage and operational
|
|
15
|
-
cost surfaces.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|