datacontract-cli 0.12.2__tar.gz → 0.12.3__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 (255) hide show
  1. {datacontract_cli-0.12.2/datacontract_cli.egg-info → datacontract_cli-0.12.3}/PKG-INFO +156 -16
  2. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/README.md +144 -6
  3. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/cli.py +42 -3
  4. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_ci.py +2 -1
  5. datacontract_cli-0.12.3/datacontract/command_dbt.py +161 -0
  6. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_test.py +2 -1
  7. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/data_contract_checks.py +2 -2
  8. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/check_soda_execute.py +5 -0
  9. datacontract_cli-0.12.3/datacontract/engines/soda/connections/redshift.py +29 -0
  10. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/dbt_exporter.py +15 -146
  11. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/sql_type_converter.py +10 -8
  12. datacontract_cli-0.12.3/datacontract/integration/dbt_sync.py +1215 -0
  13. datacontract_cli-0.12.3/datacontract/integration/dbt_test_mapping.py +165 -0
  14. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/integration/entropy_data.py +5 -2
  15. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/test_results_writer.py +4 -4
  16. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3/datacontract_cli.egg-info}/PKG-INFO +156 -16
  17. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract_cli.egg-info/SOURCES.txt +7 -0
  18. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract_cli.egg-info/requires.txt +12 -9
  19. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/pyproject.toml +14 -10
  20. datacontract_cli-0.12.3/tests/test_dbt_sync.py +1333 -0
  21. datacontract_cli-0.12.3/tests/test_dbt_test_mapping.py +169 -0
  22. datacontract_cli-0.12.3/tests/test_redshift_soda_configuration.py +75 -0
  23. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_sql_type_converter_physicaltype.py +25 -2
  24. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/LICENSE +0 -0
  25. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/MANIFEST.in +0 -0
  26. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/__init__.py +0 -0
  27. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/api.py +0 -0
  28. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/catalog/catalog.py +0 -0
  29. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/changelog/__init__.py +0 -0
  30. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/changelog/changelog.py +0 -0
  31. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/changelog/normalize.py +0 -0
  32. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_api.py +0 -0
  33. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_catalog.py +0 -0
  34. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_changelog.py +0 -0
  35. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_export.py +0 -0
  36. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_import.py +0 -0
  37. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_init.py +0 -0
  38. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_lint.py +0 -0
  39. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/command_publish.py +0 -0
  40. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/data_contract.py +0 -0
  41. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/__init__.py +0 -0
  42. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/data_contract_test.py +0 -0
  43. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  44. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  45. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  46. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  47. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/__init__.py +0 -0
  48. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/athena.py +0 -0
  49. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/bigquery.py +0 -0
  50. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/databricks.py +0 -0
  51. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/duckdb_connection.py +0 -0
  52. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/impala.py +0 -0
  53. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/kafka.py +0 -0
  54. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/mysql.py +0 -0
  55. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/oracle.py +0 -0
  56. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/postgres.py +0 -0
  57. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/snowflake.py +0 -0
  58. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/sqlserver.py +0 -0
  59. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/engines/soda/connections/trino.py +0 -0
  60. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/__init__.py +0 -0
  61. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/avro_exporter.py +0 -0
  62. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/avro_idl_exporter.py +0 -0
  63. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/bigquery_exporter.py +0 -0
  64. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/custom_exporter.py +0 -0
  65. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/data_caterer_exporter.py +0 -0
  66. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/dbml_exporter.py +0 -0
  67. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/dcs_exporter.py +0 -0
  68. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/dqx_exporter.py +0 -0
  69. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/duckdb_type_converter.py +0 -0
  70. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/excel_exporter.py +0 -0
  71. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/exporter.py +0 -0
  72. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/exporter_factory.py +0 -0
  73. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/go_exporter.py +0 -0
  74. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/great_expectations_exporter.py +0 -0
  75. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/html_exporter.py +0 -0
  76. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/iceberg_exporter.py +0 -0
  77. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/jsonschema_exporter.py +0 -0
  78. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/markdown_exporter.py +0 -0
  79. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/mermaid_exporter.py +0 -0
  80. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/odcs_export_helper.py +0 -0
  81. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/odcs_v3_exporter.py +0 -0
  82. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/pandas_type_converter.py +0 -0
  83. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/protobuf_exporter.py +0 -0
  84. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/pydantic_exporter.py +0 -0
  85. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/rdf_exporter.py +0 -0
  86. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/sodacl_exporter.py +0 -0
  87. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/spark_exporter.py +0 -0
  88. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/sql_exporter.py +0 -0
  89. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/export/sqlalchemy_exporter.py +0 -0
  90. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/avro_importer.py +0 -0
  91. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/bigquery_importer.py +0 -0
  92. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/csv_importer.py +0 -0
  93. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/dbml_importer.py +0 -0
  94. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/dbt_importer.py +0 -0
  95. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/dcs_importer.py +0 -0
  96. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/excel_importer.py +0 -0
  97. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/glue_importer.py +0 -0
  98. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/iceberg_importer.py +0 -0
  99. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/importer.py +0 -0
  100. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/importer_factory.py +0 -0
  101. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/json_importer.py +0 -0
  102. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/jsonschema_importer.py +0 -0
  103. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/odcs_helper.py +0 -0
  104. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/odcs_importer.py +0 -0
  105. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/parquet_importer.py +0 -0
  106. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/protobuf_importer.py +0 -0
  107. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/spark_importer.py +0 -0
  108. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/sql_importer.py +0 -0
  109. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/imports/unity_importer.py +0 -0
  110. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/init/init_template.py +0 -0
  111. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/lint/files.py +0 -0
  112. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/lint/resolve.py +0 -0
  113. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/lint/resources.py +0 -0
  114. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/lint/schema.py +0 -0
  115. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/lint/urls.py +0 -0
  116. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/model/changelog.py +0 -0
  117. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/model/exceptions.py +0 -0
  118. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/model/odcs.py +0 -0
  119. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/model/run.py +0 -0
  120. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/__init__.py +0 -0
  121. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/ci_output.py +0 -0
  122. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/json_test_results.py +0 -0
  123. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/junit_test_results.py +0 -0
  124. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/output_format.py +0 -0
  125. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/output/text_changelog_results.py +0 -0
  126. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/py.typed +0 -0
  127. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  128. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  129. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  130. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  131. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  132. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  133. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  134. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  135. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  136. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  137. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/datacontract.html +0 -0
  138. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/datacontract_odcs.html +0 -0
  139. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/index.html +0 -0
  140. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/datacontract_information.html +0 -0
  141. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  142. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/datacontract_terms.html +0 -0
  143. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/definition.html +0 -0
  144. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/example.html +0 -0
  145. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/model_field.html +0 -0
  146. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/quality.html +0 -0
  147. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/partials/server.html +0 -0
  148. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract/templates/style/output.css +0 -0
  149. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  150. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract_cli.egg-info/entry_points.txt +0 -0
  151. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/datacontract_cli.egg-info/top_level.txt +0 -0
  152. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/setup.cfg +0 -0
  153. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_api.py +0 -0
  154. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_bigquery_soda_connection.py +0 -0
  155. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_catalog.py +0 -0
  156. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_changelog.py +0 -0
  157. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_changelog_engine.py +0 -0
  158. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_changelog_normalize.py +0 -0
  159. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_changelog_output_text.py +0 -0
  160. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_ci_output.py +0 -0
  161. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_cli.py +0 -0
  162. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_data_contract.py +0 -0
  163. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_data_contract_checks.py +0 -0
  164. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_data_contract_specification.py +0 -0
  165. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_description_linter.py +0 -0
  166. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_download_datacontract_file.py +0 -0
  167. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_duckdb_json.py +0 -0
  168. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_avro.py +0 -0
  169. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_avro_idl.py +0 -0
  170. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_bigquery.py +0 -0
  171. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_complex_data_contract.py +0 -0
  172. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_custom.py +0 -0
  173. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_custom_exporter.py +0 -0
  174. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_custom_model.py +0 -0
  175. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_data_caterer.py +0 -0
  176. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_dbml.py +0 -0
  177. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_dbt_models.py +0 -0
  178. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_dbt_sources.py +0 -0
  179. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_dbt_staging_sql.py +0 -0
  180. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_dqx.py +0 -0
  181. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_excel.py +0 -0
  182. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_go.py +0 -0
  183. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_great_expectations.py +0 -0
  184. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_html.py +0 -0
  185. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_iceberg.py +0 -0
  186. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_jsonschema.py +0 -0
  187. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_markdown.py +0 -0
  188. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_mermaid.py +0 -0
  189. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_odcs_v3.py +0 -0
  190. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_protobuf.py +0 -0
  191. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_pydantic.py +0 -0
  192. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_rdf.py +0 -0
  193. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_sodacl.py +0 -0
  194. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_spark.py +0 -0
  195. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_sql.py +0 -0
  196. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_sql_query.py +0 -0
  197. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_export_sqlalchemy.py +0 -0
  198. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_avro.py +0 -0
  199. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_bigquery.py +0 -0
  200. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_csv.py +0 -0
  201. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_dbml.py +0 -0
  202. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_dbt.py +0 -0
  203. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_excel.py +0 -0
  204. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_glue.py +0 -0
  205. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_iceberg.py +0 -0
  206. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_json.py +0 -0
  207. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_jsonschema.py +0 -0
  208. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_odcs_v3.py +0 -0
  209. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_parquet.py +0 -0
  210. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_protobuf.py +0 -0
  211. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_spark.py +0 -0
  212. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_sql_oracle.py +0 -0
  213. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_sql_postgres.py +0 -0
  214. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_sql_snowflake.py +0 -0
  215. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_sql_sqlserver.py +0 -0
  216. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_import_unity_file.py +0 -0
  217. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_integration_entropydata.py +0 -0
  218. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_lint.py +0 -0
  219. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_require_env.py +0 -0
  220. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_resolve.py +0 -0
  221. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_roundtrip_jsonschema.py +0 -0
  222. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_sqlserver_soda_connection.py +0 -0
  223. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_api.py +0 -0
  224. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_athena_iceberg.py +0 -0
  225. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_azure_remote.py +0 -0
  226. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_bigquery.py +0 -0
  227. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_checks_filter.py +0 -0
  228. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_databricks.py +0 -0
  229. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_dataframe.py +0 -0
  230. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_delta.py +0 -0
  231. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_gcs_csv_remote.py +0 -0
  232. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_gcs_json_remote.py +0 -0
  233. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_kafka.py +0 -0
  234. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_kafka_remote.py +0 -0
  235. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_local_json.py +0 -0
  236. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_local_json_nd.py +0 -0
  237. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_mysql.py +0 -0
  238. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_oracle.py +0 -0
  239. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_output_json.py +0 -0
  240. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_output_junit.py +0 -0
  241. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_parquet.py +0 -0
  242. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_postgres.py +0 -0
  243. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_quality.py +0 -0
  244. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_csv.py +0 -0
  245. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_delta.py +0 -0
  246. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_json.py +0 -0
  247. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_json_complex.py +0 -0
  248. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_json_multiple_models.py +0 -0
  249. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_s3_json_remote.py +0 -0
  250. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_schema_evolution.py +0 -0
  251. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_server_not_found.py +0 -0
  252. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_snowflake.py +0 -0
  253. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_soda_connection_error.py +0 -0
  254. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_sqlserver.py +0 -0
  255. {datacontract_cli-0.12.2 → datacontract_cli-0.12.3}/tests/test_test_trino.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 0.12.2
3
+ Version: 0.12.3
4
4
  Summary: The datacontract CLI is an open source command-line tool for working with Data Contracts. It uses data contract YAML files to lint the data contract, connect to data sources and execute schema and quality tests, detect breaking changes, and export to different formats. The tool is written in Python. It can be used as a standalone CLI tool, in a CI/CD pipeline, or directly as a Python library.
5
5
  Author-email: Jochen Christ <jochen.christ@innoq.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@innoq.com>
6
6
  License-Expression: MIT
@@ -14,7 +14,7 @@ License-File: LICENSE
14
14
  Requires-Dist: typer<0.26,>=0.18.0
15
15
  Requires-Dist: pydantic<2.14.0,>=2.8.2
16
16
  Requires-Dist: pyyaml~=6.0.1
17
- Requires-Dist: requests<2.34,>=2.31
17
+ Requires-Dist: requests<2.35,>=2.31
18
18
  Requires-Dist: fastjsonschema<2.22.0,>=2.19.1
19
19
  Requires-Dist: jsonschema<5.0.0,>=4.23.0
20
20
  Requires-Dist: pytz>=2024.1
@@ -41,7 +41,7 @@ Provides-Extra: databricks
41
41
  Requires-Dist: soda-core-spark-df<3.6.0,>=3.3.20; extra == "databricks"
42
42
  Requires-Dist: soda-core-spark[databricks]<3.6.0,>=3.3.20; extra == "databricks"
43
43
  Requires-Dist: databricks-sql-connector<4.3.0,>=3.7.0; extra == "databricks"
44
- Requires-Dist: databricks-sdk<0.106.0; extra == "databricks"
44
+ Requires-Dist: databricks-sdk<0.109.0; extra == "databricks"
45
45
  Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
46
46
  Provides-Extra: iceberg
47
47
  Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
@@ -54,11 +54,13 @@ Requires-Dist: soda-core-mysql<3.6.0,>=3.3.20; extra == "mysql"
54
54
  Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "mysql"
55
55
  Provides-Extra: postgres
56
56
  Requires-Dist: soda-core-postgres<3.6.0,>=3.3.20; extra == "postgres"
57
+ Provides-Extra: redshift
58
+ Requires-Dist: soda-core-redshift<3.6.0,>=3.3.20; extra == "redshift"
57
59
  Provides-Extra: s3
58
60
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
59
- Requires-Dist: aiobotocore<3.6.0,>=2.17.0; extra == "s3"
61
+ Requires-Dist: aiobotocore<3.8.0,>=2.17.0; extra == "s3"
60
62
  Provides-Extra: snowflake
61
- Requires-Dist: snowflake-connector-python[pandas]<4.5,>=3.6; extra == "snowflake"
63
+ Requires-Dist: snowflake-connector-python[pandas]<4.6,>=3.6; extra == "snowflake"
62
64
  Requires-Dist: soda-core-snowflake<3.6.0,>=3.3.20; extra == "snowflake"
63
65
  Provides-Extra: sqlserver
64
66
  Requires-Dist: soda-core-sqlserver<3.6.0,>=3.3.20; extra == "sqlserver"
@@ -81,19 +83,19 @@ Provides-Extra: rdf
81
83
  Requires-Dist: rdflib==7.6.0; extra == "rdf"
82
84
  Provides-Extra: api
83
85
  Requires-Dist: fastapi==0.136.1; extra == "api"
84
- Requires-Dist: uvicorn==0.44.0; extra == "api"
86
+ Requires-Dist: uvicorn<0.47.0,>=0.44.0; extra == "api"
85
87
  Provides-Extra: protobuf
86
- Requires-Dist: protobuf<7.0,>=3.20; extra == "protobuf"
88
+ Requires-Dist: protobuf<8.0,>=3.20; extra == "protobuf"
87
89
  Provides-Extra: all
88
- Requires-Dist: datacontract-cli[api,athena,bigquery,csv,databricks,dbml,duckdb,excel,iceberg,impala,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
90
+ Requires-Dist: datacontract-cli[api,athena,bigquery,csv,databricks,dbml,duckdb,excel,iceberg,impala,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,redshift,s3,snowflake,sqlserver,trino]; extra == "all"
89
91
  Provides-Extra: dev
90
92
  Requires-Dist: datacontract-cli[all]; extra == "dev"
91
93
  Requires-Dist: httpx==0.28.1; extra == "dev"
92
94
  Requires-Dist: kafka-python; extra == "dev"
93
95
  Requires-Dist: minio==7.2.20; extra == "dev"
94
- Requires-Dist: moto==5.1.22; extra == "dev"
96
+ Requires-Dist: moto==5.2.1; extra == "dev"
95
97
  Requires-Dist: pandas>=2.1.0; extra == "dev"
96
- Requires-Dist: pre-commit<4.6.0,>=3.7.1; extra == "dev"
98
+ Requires-Dist: pre-commit<4.7.0,>=3.7.1; extra == "dev"
97
99
  Requires-Dist: pytest; extra == "dev"
98
100
  Requires-Dist: pytest-xdist; extra == "dev"
99
101
  Requires-Dist: pymssql==2.3.13; extra == "dev"
@@ -230,6 +232,9 @@ $ datacontract changelog v1.odcs.yaml v2.odcs.yaml
230
232
  # execute schema and quality checks (define credentials as environment variables)
231
233
  $ datacontract test odcs.yaml
232
234
 
235
+ # generate dbt tests from a contract into your dbt project and run `dbt test`
236
+ $ datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse
237
+
233
238
  # export data contract as html (other formats: avro, dbt-models, dbt-sources, dbt-staging-sql, jsonschema, odcs, rdf, sql, sodacl, terraform, ...)
234
239
  $ datacontract export html datacontract.yaml --output odcs.html
235
240
 
@@ -359,6 +364,7 @@ A list of available extras:
359
364
  | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
360
365
  | protobuf | `pip install datacontract-cli[protobuf]` |
361
366
  | RDF | `pip install datacontract-cli[rdf]` |
367
+ | Amazon Redshift | `pip install datacontract-cli[redshift]` |
362
368
  | S3 Integration | `pip install datacontract-cli[s3]` |
363
369
  | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
364
370
  | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
@@ -374,6 +380,7 @@ Commands
374
380
  - [lint](#lint)
375
381
  - [changelog](#changelog)
376
382
  - [test](#test)
383
+ - [dbt](#dbt-sync)
377
384
  - [ci](#ci)
378
385
  - [export](#export)
379
386
  - [import](#import)
@@ -444,13 +451,19 @@ Commands
444
451
  Show a changelog between two data contracts.
445
452
 
446
453
  ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
447
- │ * v1 TEXT The location (path) of the source (before) data contract YAML. [required]
448
- * v2 TEXT The location (path) of the target (after) data contract YAML. [required]
454
+ │ * v1 TEXT The location (url or path) of the source (before) data contract YAML.
455
+ [required]
456
+ │ * v2 TEXT The location (url or path) of the target (after) data contract YAML. │
457
+ │ [required] │
449
458
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
450
459
  ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
451
460
  │ --debug --no-debug Enable debug logging │
452
461
  │ --help Show this message and exit. │
453
462
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
463
+
464
+ Example: datacontract changelog datacontract-v1.yaml datacontract-v2.yaml
465
+
466
+
454
467
  ```
455
468
 
456
469
  ```bash
@@ -1044,6 +1057,52 @@ models:
1044
1057
 
1045
1058
  </details>
1046
1059
 
1060
+ <details markdown="1">
1061
+ <summary><strong>Amazon Redshift</strong></summary>
1062
+
1063
+ Data Contract CLI can test data in Amazon Redshift (both provisioned clusters and Redshift Serverless).
1064
+
1065
+ ##### Example
1066
+
1067
+ datacontract.yaml
1068
+ ```yaml
1069
+ servers:
1070
+ redshift:
1071
+ type: redshift
1072
+ host: my-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com
1073
+ port: 5439
1074
+ database: dev
1075
+ schema: analytics
1076
+ models:
1077
+ my_table_1: # corresponds to a table
1078
+ type: table
1079
+ fields:
1080
+ my_column_1: # corresponds to a column
1081
+ type: varchar
1082
+ ```
1083
+
1084
+ ##### Environment Variables
1085
+ All [parameters supported by Soda](https://docs.soda.io/soda/connect-redshift.html), uppercased and prepended by `DATACONTRACT_REDSHIFT_` prefix.
1086
+ For example:
1087
+
1088
+ | Soda parameter | Environment Variable | Details |
1089
+ |---------------------|-------------------------------------------|---------------------|
1090
+ | `username` | `DATACONTRACT_REDSHIFT_USERNAME` | |
1091
+ | `password` | `DATACONTRACT_REDSHIFT_PASSWORD` | leave unset for IAM |
1092
+ | `region` | `DATACONTRACT_REDSHIFT_REGION` | for IAM |
1093
+ | `access_key_id` | `DATACONTRACT_REDSHIFT_ACCESS_KEY_ID` | for IAM |
1094
+ | `secret_access_key` | `DATACONTRACT_REDSHIFT_SECRET_ACCESS_KEY` | for IAM |
1095
+ | `role_arn` | `DATACONTRACT_REDSHIFT_ROLE_ARN` | for IAM |
1096
+
1097
+ IAM credentials can be supplied in two ways:
1098
+
1099
+ 1. **AWS_PROFILE** — set `AWS_PROFILE` in your shell to a profile defined in `~/.aws/credentials` and `DATACONTRACT_REDSHIFT_REGION`.
1100
+ 2. **Explicit keys** — set `DATACONTRACT_REDSHIFT_REGION`, `..._ACCESS_KEY_ID`, `..._SECRET_ACCESS_KEY`, and `..._SESSION_TOKEN` for temporary credentials, or `..._ROLE_ARN` to assume a role.
1101
+
1102
+ >IAM authentication is supported only for **provisioned** Redshift clusters.
1103
+
1104
+ </details>
1105
+
1047
1106
  <details markdown="1">
1048
1107
  <summary><strong>MySQL</strong></summary>
1049
1108
 
@@ -1223,6 +1282,84 @@ models:
1223
1282
 
1224
1283
  </details>
1225
1284
 
1285
+ ### dbt sync
1286
+ > The `dbt sync` command is still work in progress and will receive further functionality and documentation soon.
1287
+ ```
1288
+
1289
+ Usage: datacontract dbt sync [OPTIONS] [CONTRACT]
1290
+
1291
+ Generate dbt tests from an ODCS contract and run them.
1292
+
1293
+ Within the specified dbt project, this command wipes `<model-paths>/datacontract_cli/` and
1294
+ `<test-paths>/datacontract_cli/`, regenerates them from the contract, then runs `dbt test`.
1295
+
1296
+ ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
1297
+ │ contract [CONTRACT] Path to the ODCS data contract. If omitted, searches for a single │
1298
+ │ `*.odcs.yaml` in the current directory and its subdirectories. │
1299
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1300
+ ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
1301
+ │ --project-dir PATH Path to the dbt project root │
1302
+ │ (must contain │
1303
+ │ `dbt_project.yml`). Defaults │
1304
+ │ to the current directory. │
1305
+ │ --schema-name TEXT Which ODCS schema object to │
1306
+ │ sync, by name. │
1307
+ │ [default: all] │
1308
+ │ --model-resolution [name|physicalName] How to map an ODCS schema to │
1309
+ │ a dbt model name. │
1310
+ │ [default: name] │
1311
+ │ --target TEXT Forwarded to `dbt test │
1312
+ │ --target`. │
1313
+ │ --profiles-dir PATH Forwarded to `dbt test │
1314
+ │ --profiles-dir`. │
1315
+ │ --skip-tests --run-tests Generate tests but skip │
1316
+ │ running `dbt test`. │
1317
+ │ [default: run-tests] │
1318
+ │ --publish TEXT The url to publish the │
1319
+ │ results after the test. │
1320
+ │ --server TEXT ODCS server name for │
1321
+ │ published test results. │
1322
+ │ Auto-selected if the │
1323
+ │ contract contains only one │
1324
+ │ server. Otherwise defaults │
1325
+ │ to --target. │
1326
+ │ --ssl-verification --no-ssl-verification SSL verification when │
1327
+ │ publishing test results. │
1328
+ │ [default: ssl-verification] │
1329
+ │ --debug --no-debug Enable debug logging │
1330
+ │ --help Show this message and exit. │
1331
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1332
+
1333
+ Example: datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse
1334
+
1335
+
1336
+ ```
1337
+
1338
+ `datacontract dbt sync` generates dbt tests from an ODCS data contract directly into your dbt project and (by default) runs `dbt test` against them. The contract becomes the single source of truth for column-level constraints and quality checks. It is recommended to remove existing dbt tests to avoid duplication.
1339
+
1340
+ On each run, the command:
1341
+
1342
+ - **Wipes and regenerates** the `models/datacontract_cli/` and `tests/datacontract_cli/` directories under your dbt project. The paths honor `model-paths` and `test-paths` in `dbt_project.yml`.
1343
+ - **Emits one YAML model file per ODCS schema** that uses dbt's built-in tests and [`dbt_utils`](https://github.com/dbt-labs/dbt-utils).
1344
+ - **Emits singular SQL tests** for all ODCS `quality` that can't be expressed as native YAML tests.
1345
+ - **Runs `dbt test --select tag:datacontract_cli`** to run the generated tests; pre-existing dbt tests are untouched. Pass `--skip-tests` to regenerate without invoking dbt.
1346
+
1347
+ Prerequisites: `dbt-core` plus an adapter (e.g. `dbt-duckdb`, `dbt-postgres`) on `PATH`, [`dbt_utils`](https://github.com/dbt-labs/dbt-utils) installed in your dbt project's `packages.yml`.
1348
+
1349
+ ```bash
1350
+ # Auto-discover a contract named *.odcs.yaml in a dbt project
1351
+ $ datacontract dbt sync
1352
+
1353
+ # Explicit contract, run against a specific dbt target
1354
+ $ datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse --target dev
1355
+
1356
+ # Only generate dbt tests, don't run them
1357
+ $ datacontract dbt sync orders.odcs.yaml --skip-tests
1358
+
1359
+ # Run and publish results to an Entropy Data instance
1360
+ $ datacontract dbt sync orders.odcs.yaml --publish https://api.entropy-data.com/api/test-results
1361
+ ```
1362
+
1226
1363
  ### ci
1227
1364
  ```
1228
1365
 
@@ -1273,6 +1410,9 @@ models:
1273
1410
  │ --help Show this message and │
1274
1411
  │ exit. │
1275
1412
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1413
+
1414
+ Example: datacontract ci datacontract.yaml --output test-results.xml --output-format junit
1415
+
1276
1416
 
1277
1417
  ```
1278
1418
 
@@ -1397,7 +1537,7 @@ steps:
1397
1537
 
1398
1538
  Example: datacontract export html datacontract.yaml --output datacontract.html
1399
1539
  For SQL dialects (postgres, mysql, snowflake, databricks, sqlserver, trino, oracle), use
1400
- `datacontract export sql --dialect <dialect>`.
1540
+ `datacontract export sql --dialect <dialect>`.
1401
1541
 
1402
1542
 
1403
1543
  ```
@@ -1744,9 +1884,9 @@ For more information about the Excel template structure, visit the [ODCS Excel T
1744
1884
  │ --help Show this message and exit. │
1745
1885
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1746
1886
  ╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮
1887
+ │ dbt Import a data contract from a dbt manifest file. │
1747
1888
  │ sql Import a data contract from a SQL DDL file. │
1748
1889
  │ avro Import a data contract from an Avro schema file. │
1749
- │ dbt Import a data contract from a dbt manifest file. │
1750
1890
  │ dbml Import a data contract from a DBML file. │
1751
1891
  │ glue Import a data contract from AWS Glue. │
1752
1892
  │ bigquery Import a data contract from BigQuery. │
@@ -2136,9 +2276,9 @@ Create a data contract based on the actual data. This is the fastest way to get
2136
2276
 
2137
2277
  4. Set up a CI pipeline that executes daily for continuous quality checks. Use the [`ci`](#ci) command for
2138
2278
  CI-optimized output (GitHub Actions annotations and step summary, Azure DevOps annotations).
2139
- You can also report the test results to tools like [Data Mesh Manager](https://datamesh-manager.com).
2279
+ You can also report the test results to tools like [Entropy Data](https://entropy-data.com).
2140
2280
  ```bash
2141
- $ datacontract ci --publish https://api.datamesh-manager.com/api/test-results
2281
+ $ datacontract ci --publish https://api.entropy-data.com/api/test-results
2142
2282
  ```
2143
2283
 
2144
2284
  ### Contract-First
@@ -126,6 +126,9 @@ $ datacontract changelog v1.odcs.yaml v2.odcs.yaml
126
126
  # execute schema and quality checks (define credentials as environment variables)
127
127
  $ datacontract test odcs.yaml
128
128
 
129
+ # generate dbt tests from a contract into your dbt project and run `dbt test`
130
+ $ datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse
131
+
129
132
  # export data contract as html (other formats: avro, dbt-models, dbt-sources, dbt-staging-sql, jsonschema, odcs, rdf, sql, sodacl, terraform, ...)
130
133
  $ datacontract export html datacontract.yaml --output odcs.html
131
134
 
@@ -255,6 +258,7 @@ A list of available extras:
255
258
  | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
256
259
  | protobuf | `pip install datacontract-cli[protobuf]` |
257
260
  | RDF | `pip install datacontract-cli[rdf]` |
261
+ | Amazon Redshift | `pip install datacontract-cli[redshift]` |
258
262
  | S3 Integration | `pip install datacontract-cli[s3]` |
259
263
  | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
260
264
  | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
@@ -270,6 +274,7 @@ Commands
270
274
  - [lint](#lint)
271
275
  - [changelog](#changelog)
272
276
  - [test](#test)
277
+ - [dbt](#dbt-sync)
273
278
  - [ci](#ci)
274
279
  - [export](#export)
275
280
  - [import](#import)
@@ -340,13 +345,19 @@ Commands
340
345
  Show a changelog between two data contracts.
341
346
 
342
347
  ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
343
- │ * v1 TEXT The location (path) of the source (before) data contract YAML. [required]
344
- * v2 TEXT The location (path) of the target (after) data contract YAML. [required]
348
+ │ * v1 TEXT The location (url or path) of the source (before) data contract YAML.
349
+ [required]
350
+ │ * v2 TEXT The location (url or path) of the target (after) data contract YAML. │
351
+ │ [required] │
345
352
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
346
353
  ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
347
354
  │ --debug --no-debug Enable debug logging │
348
355
  │ --help Show this message and exit. │
349
356
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
357
+
358
+ Example: datacontract changelog datacontract-v1.yaml datacontract-v2.yaml
359
+
360
+
350
361
  ```
351
362
 
352
363
  ```bash
@@ -940,6 +951,52 @@ models:
940
951
 
941
952
  </details>
942
953
 
954
+ <details markdown="1">
955
+ <summary><strong>Amazon Redshift</strong></summary>
956
+
957
+ Data Contract CLI can test data in Amazon Redshift (both provisioned clusters and Redshift Serverless).
958
+
959
+ ##### Example
960
+
961
+ datacontract.yaml
962
+ ```yaml
963
+ servers:
964
+ redshift:
965
+ type: redshift
966
+ host: my-workgroup.123456789012.us-east-1.redshift-serverless.amazonaws.com
967
+ port: 5439
968
+ database: dev
969
+ schema: analytics
970
+ models:
971
+ my_table_1: # corresponds to a table
972
+ type: table
973
+ fields:
974
+ my_column_1: # corresponds to a column
975
+ type: varchar
976
+ ```
977
+
978
+ ##### Environment Variables
979
+ All [parameters supported by Soda](https://docs.soda.io/soda/connect-redshift.html), uppercased and prepended by `DATACONTRACT_REDSHIFT_` prefix.
980
+ For example:
981
+
982
+ | Soda parameter | Environment Variable | Details |
983
+ |---------------------|-------------------------------------------|---------------------|
984
+ | `username` | `DATACONTRACT_REDSHIFT_USERNAME` | |
985
+ | `password` | `DATACONTRACT_REDSHIFT_PASSWORD` | leave unset for IAM |
986
+ | `region` | `DATACONTRACT_REDSHIFT_REGION` | for IAM |
987
+ | `access_key_id` | `DATACONTRACT_REDSHIFT_ACCESS_KEY_ID` | for IAM |
988
+ | `secret_access_key` | `DATACONTRACT_REDSHIFT_SECRET_ACCESS_KEY` | for IAM |
989
+ | `role_arn` | `DATACONTRACT_REDSHIFT_ROLE_ARN` | for IAM |
990
+
991
+ IAM credentials can be supplied in two ways:
992
+
993
+ 1. **AWS_PROFILE** — set `AWS_PROFILE` in your shell to a profile defined in `~/.aws/credentials` and `DATACONTRACT_REDSHIFT_REGION`.
994
+ 2. **Explicit keys** — set `DATACONTRACT_REDSHIFT_REGION`, `..._ACCESS_KEY_ID`, `..._SECRET_ACCESS_KEY`, and `..._SESSION_TOKEN` for temporary credentials, or `..._ROLE_ARN` to assume a role.
995
+
996
+ >IAM authentication is supported only for **provisioned** Redshift clusters.
997
+
998
+ </details>
999
+
943
1000
  <details markdown="1">
944
1001
  <summary><strong>MySQL</strong></summary>
945
1002
 
@@ -1119,6 +1176,84 @@ models:
1119
1176
 
1120
1177
  </details>
1121
1178
 
1179
+ ### dbt sync
1180
+ > The `dbt sync` command is still work in progress and will receive further functionality and documentation soon.
1181
+ ```
1182
+
1183
+ Usage: datacontract dbt sync [OPTIONS] [CONTRACT]
1184
+
1185
+ Generate dbt tests from an ODCS contract and run them.
1186
+
1187
+ Within the specified dbt project, this command wipes `<model-paths>/datacontract_cli/` and
1188
+ `<test-paths>/datacontract_cli/`, regenerates them from the contract, then runs `dbt test`.
1189
+
1190
+ ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
1191
+ │ contract [CONTRACT] Path to the ODCS data contract. If omitted, searches for a single │
1192
+ │ `*.odcs.yaml` in the current directory and its subdirectories. │
1193
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1194
+ ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
1195
+ │ --project-dir PATH Path to the dbt project root │
1196
+ │ (must contain │
1197
+ │ `dbt_project.yml`). Defaults │
1198
+ │ to the current directory. │
1199
+ │ --schema-name TEXT Which ODCS schema object to │
1200
+ │ sync, by name. │
1201
+ │ [default: all] │
1202
+ │ --model-resolution [name|physicalName] How to map an ODCS schema to │
1203
+ │ a dbt model name. │
1204
+ │ [default: name] │
1205
+ │ --target TEXT Forwarded to `dbt test │
1206
+ │ --target`. │
1207
+ │ --profiles-dir PATH Forwarded to `dbt test │
1208
+ │ --profiles-dir`. │
1209
+ │ --skip-tests --run-tests Generate tests but skip │
1210
+ │ running `dbt test`. │
1211
+ │ [default: run-tests] │
1212
+ │ --publish TEXT The url to publish the │
1213
+ │ results after the test. │
1214
+ │ --server TEXT ODCS server name for │
1215
+ │ published test results. │
1216
+ │ Auto-selected if the │
1217
+ │ contract contains only one │
1218
+ │ server. Otherwise defaults │
1219
+ │ to --target. │
1220
+ │ --ssl-verification --no-ssl-verification SSL verification when │
1221
+ │ publishing test results. │
1222
+ │ [default: ssl-verification] │
1223
+ │ --debug --no-debug Enable debug logging │
1224
+ │ --help Show this message and exit. │
1225
+ ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1226
+
1227
+ Example: datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse
1228
+
1229
+
1230
+ ```
1231
+
1232
+ `datacontract dbt sync` generates dbt tests from an ODCS data contract directly into your dbt project and (by default) runs `dbt test` against them. The contract becomes the single source of truth for column-level constraints and quality checks. It is recommended to remove existing dbt tests to avoid duplication.
1233
+
1234
+ On each run, the command:
1235
+
1236
+ - **Wipes and regenerates** the `models/datacontract_cli/` and `tests/datacontract_cli/` directories under your dbt project. The paths honor `model-paths` and `test-paths` in `dbt_project.yml`.
1237
+ - **Emits one YAML model file per ODCS schema** that uses dbt's built-in tests and [`dbt_utils`](https://github.com/dbt-labs/dbt-utils).
1238
+ - **Emits singular SQL tests** for all ODCS `quality` that can't be expressed as native YAML tests.
1239
+ - **Runs `dbt test --select tag:datacontract_cli`** to run the generated tests; pre-existing dbt tests are untouched. Pass `--skip-tests` to regenerate without invoking dbt.
1240
+
1241
+ Prerequisites: `dbt-core` plus an adapter (e.g. `dbt-duckdb`, `dbt-postgres`) on `PATH`, [`dbt_utils`](https://github.com/dbt-labs/dbt-utils) installed in your dbt project's `packages.yml`.
1242
+
1243
+ ```bash
1244
+ # Auto-discover a contract named *.odcs.yaml in a dbt project
1245
+ $ datacontract dbt sync
1246
+
1247
+ # Explicit contract, run against a specific dbt target
1248
+ $ datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse --target dev
1249
+
1250
+ # Only generate dbt tests, don't run them
1251
+ $ datacontract dbt sync orders.odcs.yaml --skip-tests
1252
+
1253
+ # Run and publish results to an Entropy Data instance
1254
+ $ datacontract dbt sync orders.odcs.yaml --publish https://api.entropy-data.com/api/test-results
1255
+ ```
1256
+
1122
1257
  ### ci
1123
1258
  ```
1124
1259
 
@@ -1169,6 +1304,9 @@ models:
1169
1304
  │ --help Show this message and │
1170
1305
  │ exit. │
1171
1306
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1307
+
1308
+ Example: datacontract ci datacontract.yaml --output test-results.xml --output-format junit
1309
+
1172
1310
 
1173
1311
  ```
1174
1312
 
@@ -1293,7 +1431,7 @@ steps:
1293
1431
 
1294
1432
  Example: datacontract export html datacontract.yaml --output datacontract.html
1295
1433
  For SQL dialects (postgres, mysql, snowflake, databricks, sqlserver, trino, oracle), use
1296
- `datacontract export sql --dialect <dialect>`.
1434
+ `datacontract export sql --dialect <dialect>`.
1297
1435
 
1298
1436
 
1299
1437
  ```
@@ -1640,9 +1778,9 @@ For more information about the Excel template structure, visit the [ODCS Excel T
1640
1778
  │ --help Show this message and exit. │
1641
1779
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
1642
1780
  ╭─ Commands ───────────────────────────────────────────────────────────────────────────────────────╮
1781
+ │ dbt Import a data contract from a dbt manifest file. │
1643
1782
  │ sql Import a data contract from a SQL DDL file. │
1644
1783
  │ avro Import a data contract from an Avro schema file. │
1645
- │ dbt Import a data contract from a dbt manifest file. │
1646
1784
  │ dbml Import a data contract from a DBML file. │
1647
1785
  │ glue Import a data contract from AWS Glue. │
1648
1786
  │ bigquery Import a data contract from BigQuery. │
@@ -2032,9 +2170,9 @@ Create a data contract based on the actual data. This is the fastest way to get
2032
2170
 
2033
2171
  4. Set up a CI pipeline that executes daily for continuous quality checks. Use the [`ci`](#ci) command for
2034
2172
  CI-optimized output (GitHub Actions annotations and step summary, Azure DevOps annotations).
2035
- You can also report the test results to tools like [Data Mesh Manager](https://datamesh-manager.com).
2173
+ You can also report the test results to tools like [Entropy Data](https://entropy-data.com).
2036
2174
  ```bash
2037
- $ datacontract ci --publish https://api.datamesh-manager.com/api/test-results
2175
+ $ datacontract ci --publish https://api.entropy-data.com/api/test-results
2038
2176
  ```
2039
2177
 
2040
2178
  ### Contract-First
@@ -15,9 +15,27 @@ console = Console()
15
15
  debug_option = Annotated[bool, typer.Option(help="Enable debug logging")]
16
16
 
17
17
 
18
+ # Order in which top-level commands appear in `datacontract --help` (cf. README.md)
19
+ COMMAND_ORDER = [
20
+ "init",
21
+ "lint",
22
+ "changelog",
23
+ "test",
24
+ "ci",
25
+ "export",
26
+ "dbt",
27
+ "import",
28
+ "catalog",
29
+ "publish",
30
+ "api",
31
+ ]
32
+
33
+
18
34
  class OrderedCommands(TyperGroup):
19
35
  def list_commands(self, ctx: Context) -> Iterable[str]:
20
- return self.commands.keys()
36
+ known = set(COMMAND_ORDER)
37
+ # Trailing fallback keeps any future command visible even if COMMAND_ORDER forgets it.
38
+ return [c for c in COMMAND_ORDER if c in self.commands] + [c for c in self.commands if c not in known]
21
39
 
22
40
 
23
41
  class OrderedCommandsWithMigrationHints(OrderedCommands):
@@ -105,10 +123,21 @@ def common(
105
123
 
106
124
 
107
125
  def enable_debug_logging(debug: bool):
126
+ root = logging.getLogger()
108
127
  if debug:
109
128
  logging.basicConfig(
110
129
  level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", stream=sys.stderr
111
130
  )
131
+ elif not root.handlers:
132
+ # Without a handler, Python's lastResort emits WARNING/ERROR messages
133
+ root.addHandler(logging.NullHandler())
134
+
135
+
136
+ def validate_publish_url(publish: str | None) -> None:
137
+ """Reject `--publish` values that aren't http/https before any real work runs."""
138
+ if publish is not None and not (publish.startswith("http://") or publish.startswith("https://")):
139
+ console.print(f"[red]--publish URL must start with http:// or https:// (got: {publish!r}).[/red]")
140
+ raise typer.Exit(code=1)
112
141
 
113
142
 
114
143
  def _print_logs(run, out=None):
@@ -123,11 +152,13 @@ def _print_logs(run, out=None):
123
152
  # Register commands (must be after app and shared helpers are defined so the
124
153
  # command_* modules can import from this module without circular-import issues)
125
154
  # ---------------------------------------------------------------------------
155
+ # Display order for `--help` is controlled by COMMAND_ORDER above, not by import order.
126
156
  from datacontract import ( # noqa: E402, F401
127
157
  command_api,
128
158
  command_catalog,
129
159
  command_changelog,
130
160
  command_ci,
161
+ command_dbt,
131
162
  command_export,
132
163
  command_import,
133
164
  command_init,
@@ -136,7 +167,6 @@ from datacontract import ( # noqa: E402, F401
136
167
  command_test,
137
168
  )
138
169
 
139
- # Commands with subcommands
140
170
  app.add_typer(
141
171
  command_import.import_app,
142
172
  name="import",
@@ -153,6 +183,12 @@ app.add_typer(
153
183
  "use `datacontract export sql --dialect <dialect>`."
154
184
  ),
155
185
  )
186
+ app.add_typer(
187
+ command_dbt.dbt_app,
188
+ name="dbt",
189
+ help="Work with data contracts in your dbt project.",
190
+ epilog="Example: datacontract dbt sync orders.odcs.yaml --project-dir ./warehouse",
191
+ )
156
192
 
157
193
 
158
194
  def main():
@@ -162,7 +198,10 @@ def main():
162
198
  # If an uncaught exception occurs, only print its name (except when debug mode is enabled)
163
199
  if "--debug" in sys.argv or os.environ.get("DATACONTRACT_CLI_DEBUG") == "1":
164
200
  raise
165
- console.print(f"[red]Error:[/red] {e}")
201
+ from datacontract.model.exceptions import DataContractException
202
+
203
+ message = e.reason if isinstance(e, DataContractException) else str(e)
204
+ console.print(f"[red]Error:[/red] {message}")
166
205
  console.print("[dim]Pass --debug (or set DATACONTRACT_CLI_DEBUG=1) for the full traceback.[/dim]")
167
206
  sys.exit(1)
168
207
 
@@ -6,7 +6,7 @@ import typer
6
6
  from rich.console import Console
7
7
  from typing_extensions import Annotated
8
8
 
9
- from datacontract.cli import _print_logs, app, console, debug_option, enable_debug_logging
9
+ from datacontract.cli import _print_logs, app, console, debug_option, enable_debug_logging, validate_publish_url
10
10
  from datacontract.data_contract import DataContract
11
11
  from datacontract.output.ci_output import write_ci_output, write_ci_summary, write_json_results
12
12
  from datacontract.output.output_format import OutputFormat
@@ -65,6 +65,7 @@ def ci(
65
65
  Run tests for CI/CD pipelines. Emits GitHub Actions annotations and step summary.
66
66
  """
67
67
  enable_debug_logging(debug)
68
+ validate_publish_url(publish)
68
69
 
69
70
  if not locations:
70
71
  locations = ["datacontract.yaml"]