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.
Files changed (224) hide show
  1. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/.gitignore +11 -0
  2. contractforge_databricks-0.2.0/CHANGELOG.md +31 -0
  3. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/PKG-INFO +7 -7
  4. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/pyproject.toml +7 -7
  5. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli.py +10 -0
  6. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_deploy.py +25 -2
  7. contractforge_databricks-0.2.0/src/contractforge_databricks/cli_stabilization.py +99 -0
  8. contractforge_databricks-0.2.0/src/contractforge_databricks/cli_standard.py +83 -0
  9. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/bronze.py +5 -5
  10. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/gold.py +7 -7
  11. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/silver.py +14 -14
  12. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/bundles.py +2 -0
  13. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/sources.py +16 -6
  14. contractforge_databricks-0.1.0/CHANGELOG.md +0 -15
  15. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/README.md +0 -0
  16. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/__init__.py +0 -0
  17. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/adapter.py +0 -0
  18. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/__init__.py +0 -0
  19. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/application.py +0 -0
  20. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/audit.py +0 -0
  21. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/annotations/sql.py +0 -0
  22. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/api.py +0 -0
  23. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/__init__.py +0 -0
  24. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/assets.py +0 -0
  25. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/project.py +0 -0
  26. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/bundles/project_config.py +0 -0
  27. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/__init__.py +0 -0
  28. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/builders.py +0 -0
  29. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/evaluate.py +0 -0
  30. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/mapping.py +0 -0
  31. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/models.py +0 -0
  32. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/runtime.py +0 -0
  33. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/capabilities/uc.py +0 -0
  34. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_governance.py +0 -0
  35. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_io.py +0 -0
  36. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cli_maintenance.py +0 -0
  37. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/coercion.py +0 -0
  38. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/contract_extensions.py +0 -0
  39. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/__init__.py +0 -0
  40. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/model.py +0 -0
  41. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/report.py +0 -0
  42. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/cost/sql.py +0 -0
  43. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/dashboards/__init__.py +0 -0
  44. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/dashboards/control_tables.py +0 -0
  45. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/diagnostics/__init__.py +0 -0
  46. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/diagnostics/explain.py +0 -0
  47. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/environment.py +0 -0
  48. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/__init__.py +0 -0
  49. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/ddl.py +0 -0
  50. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/governance_log.py +0 -0
  51. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/helpers.py +0 -0
  52. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/ops_log.py +0 -0
  53. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/records.py +0 -0
  54. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/run_log.py +0 -0
  55. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/schemas.py +0 -0
  56. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/sql.py +0 -0
  57. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/tables.py +0 -0
  58. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/evidence/writer.py +0 -0
  59. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/__init__.py +0 -0
  60. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/delta_basic.py +0 -0
  61. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/hash_diff.py +0 -0
  62. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/hash_diff_latest.py +0 -0
  63. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/replace_partitions.py +0 -0
  64. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/results.py +0 -0
  65. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/retry.py +0 -0
  66. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2.py +0 -0
  67. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2_deletes.py +0 -0
  68. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/scd2_late.py +0 -0
  69. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/snapshot.py +0 -0
  70. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/sql_merge.py +0 -0
  71. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/tables.py +0 -0
  72. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/execution/windows.py +0 -0
  73. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/__init__.py +0 -0
  74. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/access.py +0 -0
  75. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/application.py +0 -0
  76. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/drift.py +0 -0
  77. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/runtime.py +0 -0
  78. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/sql.py +0 -0
  79. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/governance/validation.py +0 -0
  80. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/__init__.py +0 -0
  81. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/compatibility.py +0 -0
  82. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lakeflow/rendering.py +0 -0
  83. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lineage/__init__.py +0 -0
  84. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/lineage/openlineage.py +0 -0
  85. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/__init__.py +0 -0
  86. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/retention.py +0 -0
  87. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/maintenance/sql.py +0 -0
  88. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/__init__.py +0 -0
  89. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/history.py +0 -0
  90. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/metrics/write.py +0 -0
  91. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/__init__.py +0 -0
  92. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/application.py +0 -0
  93. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/operations/sql.py +0 -0
  94. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/__init__.py +0 -0
  95. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/catalog.py +0 -0
  96. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/models.py +0 -0
  97. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/parity/scenarios.py +0 -0
  98. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/partitioning/__init__.py +0 -0
  99. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/partitioning/predicates.py +0 -0
  100. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/__init__.py +0 -0
  101. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/deduplicate.py +0 -0
  102. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/encoding.py +0 -0
  103. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/hashing.py +0 -0
  104. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/pyspark.py +0 -0
  105. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/pyspark_staging.py +0 -0
  106. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/shape.py +0 -0
  107. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/shape_validation.py +0 -0
  108. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/staging.py +0 -0
  109. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/preparation/zip_arrays.py +0 -0
  110. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/__init__.py +0 -0
  111. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/base.py +0 -0
  112. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/catalog.py +0 -0
  113. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/core.py +0 -0
  114. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/modifiers.py +0 -0
  115. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/runtime.py +0 -0
  116. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/presets/write_engine.py +0 -0
  117. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/__init__.py +0 -0
  118. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/evaluation.py +0 -0
  119. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/persistence.py +0 -0
  120. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/registry.py +0 -0
  121. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/results.py +0 -0
  122. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/quality/sql.py +0 -0
  123. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/__init__.py +0 -0
  124. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/bundle.py +0 -0
  125. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/markdown.py +0 -0
  126. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/rendering/names.py +0 -0
  127. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/results.py +0 -0
  128. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/__init__.py +0 -0
  129. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/available_now.py +0 -0
  130. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/cache.py +0 -0
  131. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/control_tables.py +0 -0
  132. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/deploy.py +0 -0
  133. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/detection.py +0 -0
  134. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/dry_run.py +0 -0
  135. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/errors.py +0 -0
  136. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/file_selection.py +0 -0
  137. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/finalization.py +0 -0
  138. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/governance.py +0 -0
  139. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/hooks.py +0 -0
  140. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_file.py +0 -0
  141. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_retry.py +0 -0
  142. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/http_safety.py +0 -0
  143. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/json_materialization.py +0 -0
  144. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/lineage.py +0 -0
  145. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/maintenance.py +0 -0
  146. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/merge_validation.py +0 -0
  147. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/metadata.py +0 -0
  148. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/metrics.py +0 -0
  149. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/models.py +0 -0
  150. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/options.py +0 -0
  151. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/orchestration_context.py +0 -0
  152. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/orchestrator.py +0 -0
  153. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/partitioning.py +0 -0
  154. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/quality_quarantine.py +0 -0
  155. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_api.py +0 -0
  156. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_auth.py +0 -0
  157. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/rest_pagination.py +0 -0
  158. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/run_payload.py +0 -0
  159. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/schema.py +0 -0
  160. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_metadata.py +0 -0
  161. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_registry.py +0 -0
  162. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/source_schema.py +0 -0
  163. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/spark.py +0 -0
  164. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/spark_defaults.py +0 -0
  165. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/storage_auth.py +0 -0
  166. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/streaming.py +0 -0
  167. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/success.py +0 -0
  168. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/utils.py +0 -0
  169. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/watermark.py +0 -0
  170. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/windows.py +0 -0
  171. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write.py +0 -0
  172. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write_flow.py +0 -0
  173. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/runtime/write_strategy.py +0 -0
  174. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/__init__.py +0 -0
  175. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/diff.py +0 -0
  176. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/policy.py +0 -0
  177. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/schema/sync.py +0 -0
  178. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/__init__.py +0 -0
  179. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/errors.py +0 -0
  180. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/redaction.py +0 -0
  181. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/secrets.py +0 -0
  182. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/security/source_policy.py +0 -0
  183. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/shapes/__init__.py +0 -0
  184. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/shapes/sql.py +0 -0
  185. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/__init__.py +0 -0
  186. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/artifacts.py +0 -0
  187. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/autoloader.py +0 -0
  188. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/bounded_streams.py +0 -0
  189. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/classification.py +0 -0
  190. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/delta_share.py +0 -0
  191. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/files.py +0 -0
  192. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/http_file.py +0 -0
  193. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/interpret.py +0 -0
  194. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/jdbc.py +0 -0
  195. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/metadata.py +0 -0
  196. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/native_passthrough.py +0 -0
  197. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rds_iam.py +0 -0
  198. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rds_iam_runtime.py +0 -0
  199. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/rest_api.py +0 -0
  200. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/support.py +0 -0
  201. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sources/table_refs.py +0 -0
  202. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/__init__.py +0 -0
  203. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/identifiers.py +0 -0
  204. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/sql/literals.py +0 -0
  205. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/__init__.py +0 -0
  206. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/ddl.py +0 -0
  207. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/migrations.py +0 -0
  208. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/queries.py +0 -0
  209. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/sql.py +0 -0
  210. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/tables.py +0 -0
  211. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/state/writer.py +0 -0
  212. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/__init__.py +0 -0
  213. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/catalog.py +0 -0
  214. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/catalog_parity.py +0 -0
  215. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/core.py +0 -0
  216. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/templates/enrichment.py +0 -0
  217. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/transforms/__init__.py +0 -0
  218. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/transforms/sql.py +0 -0
  219. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/watermark/__init__.py +0 -0
  220. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/watermark/sql.py +0 -0
  221. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/__init__.py +0 -0
  222. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/registry.py +0 -0
  223. {contractforge_databricks-0.1.0 → contractforge_databricks-0.2.0}/src/contractforge_databricks/write_modes/sql.py +0 -0
  224. {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.1.0
3
+ Version: 0.2.0
4
4
  Summary: Databricks adapter for ContractForge Core.
5
- Project-URL: Homepage, https://github.com/marquesantero/contractforge-core/tree/main/adapters/databricks
6
- Project-URL: Documentation, https://marquesantero.github.io/contractforge-core/docs/adapters/databricks
7
- Project-URL: Repository, https://github.com/marquesantero/contractforge-core
8
- Project-URL: Issues, https://github.com/marquesantero/contractforge-core/issues
9
- Project-URL: Changelog, https://github.com/marquesantero/contractforge-core/blob/main/adapters/databricks/CHANGELOG.md
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.2,>=0.1
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.1.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.1,<0.2"]
26
+ dependencies = ["contractforge-core>=0.2,<0.3"]
27
27
 
28
28
  [project.urls]
29
- Homepage = "https://github.com/marquesantero/contractforge-core/tree/main/adapters/databricks"
30
- Documentation = "https://marquesantero.github.io/contractforge-core/docs/adapters/databricks"
31
- Repository = "https://github.com/marquesantero/contractforge-core"
32
- Issues = "https://github.com/marquesantero/contractforge-core/issues"
33
- Changelog = "https://github.com/marquesantero/contractforge-core/blob/main/adapters/databricks/CHANGELOG.md"
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
- parser.add_argument("--run", action="store_true", help="Run the deployed bundle job after deployment.")
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": "scd0_append",
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": "scd0_append",
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": "scd0_append",
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": "scd0_overwrite",
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": "scd0_overwrite",
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": "scd0_overwrite",
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": "scd0_overwrite",
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": "scd1_upsert",
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": "snapshot_soft_delete",
50
+ "mode": "snapshot_reconcile_soft_delete",
51
51
  "schema_policy": "strict",
52
52
  "on_quality_fail": "fail",
53
53
  },
54
- "gold_scd1_serving": {
55
- PRESET_META_KEY: meta("gold_scd1_serving", "gold", "ingestion", "Gold SCD1 serving.", ["merge_keys"]),
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": "scd1_upsert",
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 SCD1 Delta MERGE.", ["merge_keys"]),
9
+ PRESET_META_KEY: meta("silver_scd1_upsert", "silver", "ingestion", "Silver current-state Delta MERGE.", ["merge_keys"]),
10
10
  "layer": "silver",
11
- "mode": "scd1_upsert",
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 SCD1 MERGE pruned by partition.",
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": "scd1_upsert",
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": "scd1_upsert",
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 SCD1 incremental watermark upsert.",
54
+ "Silver current-state incremental watermark upsert.",
55
55
  ["merge_keys", "watermark_columns"],
56
56
  ),
57
57
  "layer": "silver",
58
- "mode": "scd1_upsert",
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": "scd1_hash_diff",
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 SCD1 with quarantine for row-level rules.",
76
+ "Silver current-state merge with quarantine for row-level rules.",
77
77
  ["merge_keys"],
78
78
  ),
79
79
  "layer": "silver",
80
- "mode": "scd1_upsert",
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": "snapshot_soft_delete",
90
+ "mode": "snapshot_reconcile_soft_delete",
91
91
  "schema_policy": "additive_only",
92
92
  "on_quality_fail": "fail",
93
93
  },
94
- "silver_scd2_historical": {
95
- PRESET_META_KEY: meta("silver_scd2_historical", "silver", "ingestion", "Silver SCD2 history.", ["merge_keys"]),
94
+ "silver_historical": {
95
+ PRESET_META_KEY: meta("silver_historical", "silver", "ingestion", "Silver historical versioning.", ["merge_keys"]),
96
96
  "layer": "silver",
97
- "mode": "scd2_historical",
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.