datacontract-cli 0.10.32__tar.gz → 0.10.34__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.

Potentially problematic release.


This version of datacontract-cli might be problematic. Click here for more details.

Files changed (220) hide show
  1. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/LICENSE +1 -1
  2. {datacontract_cli-0.10.32/datacontract_cli.egg-info → datacontract_cli-0.10.34}/PKG-INFO +111 -12
  3. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/README.md +102 -5
  4. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/cli.py +20 -5
  5. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/data_contract.py +8 -2
  6. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/data_contract_checks.py +102 -59
  7. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/data_contract_test.py +37 -0
  8. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/fastjsonschema/check_jsonschema.py +8 -0
  9. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/check_soda_execute.py +6 -0
  10. datacontract_cli-0.10.34/datacontract/engines/soda/connections/athena.py +79 -0
  11. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/duckdb_connection.py +3 -0
  12. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/avro_converter.py +12 -2
  13. datacontract_cli-0.10.34/datacontract/export/excel_exporter.py +922 -0
  14. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/exporter.py +1 -0
  15. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/exporter_factory.py +4 -0
  16. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/markdown_converter.py +115 -5
  17. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/sql_type_converter.py +4 -0
  18. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/avro_importer.py +33 -7
  19. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/excel_importer.py +13 -5
  20. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/odcs_v3_importer.py +1 -0
  21. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/spark_importer.py +12 -1
  22. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34/datacontract_cli.egg-info}/PKG-INFO +111 -12
  23. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract_cli.egg-info/SOURCES.txt +5 -0
  24. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract_cli.egg-info/requires.txt +9 -6
  25. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/pyproject.toml +11 -7
  26. datacontract_cli-0.10.34/tests/test_export_excel.py +104 -0
  27. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_avro.py +38 -0
  28. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_spark.py +3 -1
  29. datacontract_cli-0.10.34/tests/test_test_api.py +55 -0
  30. datacontract_cli-0.10.34/tests/test_test_athena_iceberg.py +26 -0
  31. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_postgres.py +1 -1
  32. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_quality.py +1 -1
  33. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_sqlserver.py +1 -1
  34. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_trino.py +1 -1
  35. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/MANIFEST.in +0 -0
  36. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/__init__.py +0 -0
  37. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/api.py +0 -0
  38. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/breaking/breaking.py +0 -0
  39. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/breaking/breaking_change.py +0 -0
  40. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/breaking/breaking_rules.py +0 -0
  41. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/catalog/catalog.py +0 -0
  42. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/__init__.py +0 -0
  43. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  44. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  45. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  46. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/__init__.py +0 -0
  47. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/bigquery.py +0 -0
  48. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/databricks.py +0 -0
  49. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/kafka.py +0 -0
  50. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/postgres.py +0 -0
  51. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/snowflake.py +0 -0
  52. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/sqlserver.py +0 -0
  53. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/engines/soda/connections/trino.py +0 -0
  54. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/__init__.py +0 -0
  55. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/avro_idl_converter.py +0 -0
  56. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/bigquery_converter.py +0 -0
  57. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/custom_converter.py +0 -0
  58. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/data_caterer_converter.py +0 -0
  59. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/dbml_converter.py +0 -0
  60. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/dbt_converter.py +0 -0
  61. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/dcs_exporter.py +0 -0
  62. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/duckdb_type_converter.py +0 -0
  63. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/go_converter.py +0 -0
  64. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/great_expectations_converter.py +0 -0
  65. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/html_exporter.py +0 -0
  66. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/iceberg_converter.py +0 -0
  67. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/jsonschema_converter.py +0 -0
  68. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/mermaid_exporter.py +0 -0
  69. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/odcs_v3_exporter.py +0 -0
  70. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/pandas_type_converter.py +0 -0
  71. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/protobuf_converter.py +0 -0
  72. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/pydantic_converter.py +0 -0
  73. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/rdf_converter.py +0 -0
  74. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/sodacl_converter.py +0 -0
  75. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/spark_converter.py +0 -0
  76. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/sql_converter.py +0 -0
  77. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/sqlalchemy_converter.py +0 -0
  78. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/export/terraform_converter.py +0 -0
  79. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/bigquery_importer.py +0 -0
  80. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/csv_importer.py +0 -0
  81. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/dbml_importer.py +0 -0
  82. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/dbt_importer.py +0 -0
  83. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/glue_importer.py +0 -0
  84. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/iceberg_importer.py +0 -0
  85. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/importer.py +0 -0
  86. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/importer_factory.py +0 -0
  87. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/json_importer.py +0 -0
  88. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/jsonschema_importer.py +0 -0
  89. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/odcs_importer.py +0 -0
  90. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/parquet_importer.py +0 -0
  91. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/protobuf_importer.py +0 -0
  92. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/sql_importer.py +0 -0
  93. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/imports/unity_importer.py +0 -0
  94. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/init/init_template.py +0 -0
  95. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/integration/datamesh_manager.py +0 -0
  96. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/files.py +0 -0
  97. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/lint.py +0 -0
  98. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/__init__.py +0 -0
  99. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/description_linter.py +0 -0
  100. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/field_pattern_linter.py +0 -0
  101. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/field_reference_linter.py +0 -0
  102. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/notice_period_linter.py +0 -0
  103. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/linters/valid_constraints_linter.py +0 -0
  104. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/resolve.py +0 -0
  105. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/resources.py +0 -0
  106. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/schema.py +0 -0
  107. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/lint/urls.py +0 -0
  108. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/model/data_contract_specification/__init__.py +0 -0
  109. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/model/exceptions.py +0 -0
  110. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/model/odcs.py +0 -0
  111. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/model/run.py +0 -0
  112. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/output/__init__.py +0 -0
  113. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/output/junit_test_results.py +0 -0
  114. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/output/output_format.py +0 -0
  115. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/output/test_results_writer.py +0 -0
  116. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/py.typed +0 -0
  117. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  118. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  119. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  120. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  121. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  122. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/datacontract.html +0 -0
  123. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/datacontract_odcs.html +0 -0
  124. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/index.html +0 -0
  125. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/datacontract_information.html +0 -0
  126. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  127. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/datacontract_terms.html +0 -0
  128. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/definition.html +0 -0
  129. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/example.html +0 -0
  130. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/model_field.html +0 -0
  131. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/quality.html +0 -0
  132. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/partials/server.html +0 -0
  133. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract/templates/style/output.css +0 -0
  134. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  135. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract_cli.egg-info/entry_points.txt +0 -0
  136. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/datacontract_cli.egg-info/top_level.txt +0 -0
  137. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/setup.cfg +0 -0
  138. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_api.py +0 -0
  139. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_breaking.py +0 -0
  140. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_catalog.py +0 -0
  141. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_changelog.py +0 -0
  142. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_cli.py +0 -0
  143. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_data_contract_checks.py +0 -0
  144. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_data_contract_specification.py +0 -0
  145. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_description_linter.py +0 -0
  146. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_documentation_linter.py +0 -0
  147. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_download_datacontract_file.py +0 -0
  148. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_duckdb_json.py +0 -0
  149. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_avro.py +0 -0
  150. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_avro_idl.py +0 -0
  151. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_bigquery.py +0 -0
  152. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_complex_data_contract.py +0 -0
  153. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_custom.py +0 -0
  154. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_custom_exporter.py +0 -0
  155. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_data_caterer.py +0 -0
  156. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_dbml.py +0 -0
  157. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_dbt_models.py +0 -0
  158. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_dbt_sources.py +0 -0
  159. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_dbt_staging_sql.py +0 -0
  160. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_go.py +0 -0
  161. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_great_expectations.py +0 -0
  162. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_html.py +0 -0
  163. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_iceberg.py +0 -0
  164. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_jsonschema.py +0 -0
  165. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_markdown.py +0 -0
  166. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_mermaid.py +0 -0
  167. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_odcs_v3.py +0 -0
  168. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_protobuf.py +0 -0
  169. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_pydantic.py +0 -0
  170. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_rdf.py +0 -0
  171. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_sodacl.py +0 -0
  172. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_spark.py +0 -0
  173. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_sql.py +0 -0
  174. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_sql_query.py +0 -0
  175. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_sqlalchemy.py +0 -0
  176. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_export_terraform.py +0 -0
  177. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_field_constraint_linter.py +0 -0
  178. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_field_pattern_linter.py +0 -0
  179. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_field_reference_linter.py +0 -0
  180. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_bigquery.py +0 -0
  181. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_csv.py +0 -0
  182. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_dbml.py +0 -0
  183. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_dbt.py +0 -0
  184. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_excel.py +0 -0
  185. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_glue.py +0 -0
  186. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_iceberg.py +0 -0
  187. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_json.py +0 -0
  188. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_jsonschema.py +0 -0
  189. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_odcs_v3.py +0 -0
  190. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_parquet.py +0 -0
  191. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_protobuf.py +0 -0
  192. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_sql_postgres.py +0 -0
  193. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_sql_sqlserver.py +0 -0
  194. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_import_unity_file.py +0 -0
  195. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_integration_datameshmanager.py +0 -0
  196. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_lint.py +0 -0
  197. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_notice_period_linter.py +0 -0
  198. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_resolve.py +0 -0
  199. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_roundtrip_jsonschema.py +0 -0
  200. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_spec_fields_field.py +0 -0
  201. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_spec_ref.py +0 -0
  202. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_azure_remote.py +0 -0
  203. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_bigquery.py +0 -0
  204. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_databricks.py +0 -0
  205. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_dataframe.py +0 -0
  206. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_delta.py +0 -0
  207. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_gcs_csv_remote.py +0 -0
  208. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_gcs_json_remote.py +0 -0
  209. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_kafka.py +0 -0
  210. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_kafka_remote.py +0 -0
  211. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_local_json.py +0 -0
  212. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_output_junit.py +0 -0
  213. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_parquet.py +0 -0
  214. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_csv.py +0 -0
  215. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_delta.py +0 -0
  216. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_json.py +0 -0
  217. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_json_complex.py +0 -0
  218. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_json_multiple_models.py +0 -0
  219. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_s3_json_remote.py +0 -0
  220. {datacontract_cli-0.10.32 → datacontract_cli-0.10.34}/tests/test_test_snowflake.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 innoQ Deutschland GmbH
3
+ Copyright (c) 2025 Entropy Data GmbH
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 0.10.32
3
+ Version: 0.10.34
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
@@ -20,7 +20,7 @@ Requires-Dist: fastparquet<2025.0.0,>=2024.5.0
20
20
  Requires-Dist: numpy<2.0.0,>=1.26.4
21
21
  Requires-Dist: python-multipart<1.0.0,>=0.0.20
22
22
  Requires-Dist: rich<15.0,>=13.7
23
- Requires-Dist: sqlglot<27.0.0,>=26.6.0
23
+ Requires-Dist: sqlglot<28.0.0,>=26.6.0
24
24
  Requires-Dist: duckdb<2.0.0,>=1.0.0
25
25
  Requires-Dist: soda-core-duckdb<3.6.0,>=3.3.20
26
26
  Requires-Dist: setuptools>=60
@@ -42,7 +42,7 @@ Provides-Extra: databricks
42
42
  Requires-Dist: soda-core-spark-df<3.6.0,>=3.3.20; extra == "databricks"
43
43
  Requires-Dist: soda-core-spark[databricks]<3.6.0,>=3.3.20; extra == "databricks"
44
44
  Requires-Dist: databricks-sql-connector<4.1.0,>=3.7.0; extra == "databricks"
45
- Requires-Dist: databricks-sdk<0.60.0; extra == "databricks"
45
+ Requires-Dist: databricks-sdk<0.61.0; extra == "databricks"
46
46
  Requires-Dist: pyspark<4.0.0,>=3.5.5; extra == "databricks"
47
47
  Provides-Extra: iceberg
48
48
  Requires-Dist: pyiceberg==0.9.1; extra == "iceberg"
@@ -56,10 +56,12 @@ Provides-Extra: s3
56
56
  Requires-Dist: s3fs<2026.0.0,>=2025.2.0; extra == "s3"
57
57
  Requires-Dist: aiobotocore<2.24.0,>=2.17.0; extra == "s3"
58
58
  Provides-Extra: snowflake
59
- Requires-Dist: snowflake-connector-python[pandas]<3.16,>=3.6; extra == "snowflake"
59
+ Requires-Dist: snowflake-connector-python[pandas]<3.17,>=3.6; extra == "snowflake"
60
60
  Requires-Dist: soda-core-snowflake<3.6.0,>=3.3.20; extra == "snowflake"
61
61
  Provides-Extra: sqlserver
62
62
  Requires-Dist: soda-core-sqlserver<3.6.0,>=3.3.20; extra == "sqlserver"
63
+ Provides-Extra: athena
64
+ Requires-Dist: soda-core-athena<3.6.0,>=3.3.20; extra == "athena"
63
65
  Provides-Extra: trino
64
66
  Requires-Dist: soda-core-trino<3.6.0,>=3.3.20; extra == "trino"
65
67
  Provides-Extra: dbt
@@ -76,19 +78,19 @@ Requires-Dist: uvicorn==0.35.0; extra == "api"
76
78
  Provides-Extra: protobuf
77
79
  Requires-Dist: grpcio-tools>=1.53; extra == "protobuf"
78
80
  Provides-Extra: all
79
- Requires-Dist: datacontract-cli[api,bigquery,csv,databricks,dbml,dbt,excel,iceberg,kafka,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
81
+ Requires-Dist: datacontract-cli[api,athena,bigquery,csv,databricks,dbml,dbt,excel,iceberg,kafka,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
80
82
  Provides-Extra: dev
81
83
  Requires-Dist: datacontract-cli[all]; extra == "dev"
82
84
  Requires-Dist: httpx==0.28.1; extra == "dev"
83
85
  Requires-Dist: kafka-python; extra == "dev"
84
- Requires-Dist: moto==5.1.6; extra == "dev"
86
+ Requires-Dist: moto==5.1.8; extra == "dev"
85
87
  Requires-Dist: pandas>=2.1.0; extra == "dev"
86
88
  Requires-Dist: pre-commit<4.3.0,>=3.7.1; extra == "dev"
87
89
  Requires-Dist: pytest; extra == "dev"
88
90
  Requires-Dist: pytest-xdist; extra == "dev"
89
91
  Requires-Dist: pymssql==2.3.7; extra == "dev"
90
92
  Requires-Dist: ruff; extra == "dev"
91
- Requires-Dist: testcontainers[kafka,minio,mssql,postgres]==4.10.0; extra == "dev"
93
+ Requires-Dist: testcontainers[kafka,minio,mssql,postgres]==4.12.0; extra == "dev"
92
94
  Requires-Dist: trino==0.335.0; extra == "dev"
93
95
  Dynamic: license-file
94
96
 
@@ -214,9 +216,15 @@ $ datacontract export --format odcs datacontract.yaml --output odcs.yaml
214
216
  # import ODCS to data contract
215
217
  $ datacontract import --format odcs odcs.yaml --output datacontract.yaml
216
218
 
217
- # import sql (other formats: avro, glue, bigquery, jsonschema ...)
219
+ # import sql (other formats: avro, glue, bigquery, jsonschema, excel ...)
218
220
  $ datacontract import --format sql --source my-ddl.sql --dialect postgres --output datacontract.yaml
219
221
 
222
+ # import from Excel template
223
+ $ datacontract import --format excel --source odcs.xlsx --output datacontract.yaml
224
+
225
+ # export to Excel template
226
+ $ datacontract export --format excel --output odcs.xlsx datacontract.yaml
227
+
220
228
  # find differences between two data contracts
221
229
  $ datacontract diff datacontract-v1.yaml datacontract-v2.yaml
222
230
 
@@ -310,6 +318,7 @@ A list of available extras:
310
318
 
311
319
  | Dependency | Installation Command |
312
320
  |-------------------------|--------------------------------------------|
321
+ | Amazon Athena | `pip install datacontract-cli[athena]` |
313
322
  | Avro Support | `pip install datacontract-cli[avro]` |
314
323
  | Google BigQuery | `pip install datacontract-cli[bigquery]` |
315
324
  | Databricks Integration | `pip install datacontract-cli[databricks]` |
@@ -454,6 +463,7 @@ Credentials are provided with environment variables.
454
463
  Supported server types:
455
464
 
456
465
  - [s3](#S3)
466
+ - [athena](#athena)
457
467
  - [bigquery](#bigquery)
458
468
  - [azure](#azure)
459
469
  - [sqlserver](#sqlserver)
@@ -464,6 +474,7 @@ Supported server types:
464
474
  - [kafka](#kafka)
465
475
  - [postgres](#postgres)
466
476
  - [trino](#trino)
477
+ - [api](#api)
467
478
  - [local](#local)
468
479
 
469
480
  Supported formats:
@@ -523,6 +534,41 @@ servers:
523
534
  | `DATACONTRACT_S3_SESSION_TOKEN` | `AQoDYXdzEJr...` | AWS temporary session token (optional) |
524
535
 
525
536
 
537
+ #### Athena
538
+
539
+ Data Contract CLI can test data in AWS Athena stored in S3.
540
+ Supports different file formats, such as Iceberg, Parquet, JSON, CSV...
541
+
542
+ ##### Example
543
+
544
+ datacontract.yaml
545
+ ```yaml
546
+ servers:
547
+ athena:
548
+ type: athena
549
+ catalog: awsdatacatalog # awsdatacatalog is the default setting
550
+ schema: icebergdemodb # in Athena, this is called "database"
551
+ regionName: eu-central-1
552
+ stagingDir: s3://my-bucket/athena-results/
553
+ models:
554
+ my_table: # corresponds to a table of view name
555
+ type: table
556
+ fields:
557
+ my_column_1: # corresponds to a column
558
+ type: string
559
+ config:
560
+ physicalType: varchar
561
+ ```
562
+
563
+ ##### Environment Variables
564
+
565
+ | Environment Variable | Example | Description |
566
+ |-------------------------------------|---------------------------------|----------------------------------------|
567
+ | `DATACONTRACT_S3_REGION` | `eu-central-1` | Region of Athena service |
568
+ | `DATACONTRACT_S3_ACCESS_KEY_ID` | `AKIAXV5Q5QABCDEFGH` | AWS Access Key ID |
569
+ | `DATACONTRACT_S3_SECRET_ACCESS_KEY` | `93S7LRrJcqLaaaa/XXXXXXXXXXXXX` | AWS Secret Access Key |
570
+ | `DATACONTRACT_S3_SESSION_TOKEN` | `AQoDYXdzEJr...` | AWS temporary session token (optional) |
571
+
526
572
 
527
573
  #### Google Cloud Storage (GCS)
528
574
 
@@ -890,6 +936,38 @@ models:
890
936
  | `DATACONTRACT_TRINO_PASSWORD` | `mysecretpassword` | Password |
891
937
 
892
938
 
939
+ #### API
940
+
941
+ Data Contract CLI can test APIs that return data in JSON format.
942
+ Currently, only GET requests are supported.
943
+
944
+ ##### Example
945
+
946
+ datacontract.yaml
947
+ ```yaml
948
+ servers:
949
+ api:
950
+ type: "api"
951
+ location: "https://api.example.com/path"
952
+ delimiter: none # new_line, array, or none (default)
953
+
954
+ models:
955
+ my_object: # corresponds to the root element of the JSON response
956
+ type: object
957
+ fields:
958
+ field1:
959
+ type: string
960
+ fields2:
961
+ type: number
962
+ ```
963
+
964
+ ##### Environment Variables
965
+
966
+ | Environment Variable | Example | Description |
967
+ |-----------------------------------------|------------------|---------------------------------------------------|
968
+ | `DATACONTRACT_API_HEADER_AUTHORIZATION` | `Bearer <token>` | The value for the `authorization` header. Optional. |
969
+
970
+
893
971
  #### Local
894
972
 
895
973
  Data Contract CLI can test local files in parquet, json, csv, or delta format.
@@ -933,7 +1011,7 @@ models:
933
1011
  │ terraform|avro-idl|sql|sql-query|mer │
934
1012
  │ maid|html|go|bigquery|dbml|spark|sql │
935
1013
  │ alchemy|data-caterer|dcs|markdown|ic │
936
- │ eberg|custom]
1014
+ │ eberg|custom|excel]
937
1015
  │ --output PATH Specify the file path where the │
938
1016
  │ exported data will be saved. If no │
939
1017
  │ path is provided, the output will be │
@@ -953,8 +1031,10 @@ models:
953
1031
  │ --engine TEXT [engine] The engine used for great │
954
1032
  │ expection run. │
955
1033
  │ [default: None] │
956
- │ --template PATH [custom] The file path of Jinja
957
- template.
1034
+ │ --template PATH The file path or URL of a template.
1035
+ For Excel format: path/URL to custom
1036
+ │ Excel template. For custom format: │
1037
+ │ path to Jinja template. │
958
1038
  │ [default: None] │
959
1039
  │ --help Show this message and exit. │
960
1040
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -1003,6 +1083,7 @@ Available export options:
1003
1083
  | `dcs` | Export to Data Contract Specification in YAML format | ✅ |
1004
1084
  | `markdown` | Export to Markdown | ✅ |
1005
1085
  | `iceberg` | Export to an Iceberg JSON Schema Definition | partial |
1086
+ | `excel` | Export to ODCS Excel Template | ✅ |
1006
1087
  | `custom` | Export to Custom format with Jinja | ✅ |
1007
1088
  | Missing something? | Please create an issue on GitHub | TBD |
1008
1089
 
@@ -1274,6 +1355,22 @@ FROM
1274
1355
  {{ ref('orders') }}
1275
1356
  ```
1276
1357
 
1358
+ #### ODCS Excel Templace
1359
+
1360
+ The `export` function converts a data contract into an ODCS (Open Data Contract Standard) Excel template. This creates a user-friendly Excel spreadsheet that can be used for authoring, sharing, and managing data contracts using the familiar Excel interface.
1361
+
1362
+ ```shell
1363
+ datacontract export --format excel --output datacontract.xlsx datacontract.yaml
1364
+ ```
1365
+
1366
+ The Excel format enables:
1367
+ - **User-friendly authoring**: Create and edit data contracts in Excel's familiar interface
1368
+ - **Easy sharing**: Distribute data contracts as standard Excel files
1369
+ - **Collaboration**: Enable non-technical stakeholders to contribute to data contract definitions
1370
+ - **Round-trip conversion**: Import Excel templates back to YAML data contracts
1371
+
1372
+ For more information about the Excel template structure, visit the [ODCS Excel Template repository](https://github.com/datacontract/open-data-contract-standard-excel-template).
1373
+
1277
1374
  ### import
1278
1375
  ```
1279
1376
 
@@ -1392,6 +1489,7 @@ Available import options:
1392
1489
  | `spark` | Import from Spark StructTypes, Variant | ✅ |
1393
1490
  | `sql` | Import from SQL DDL | ✅ |
1394
1491
  | `unity` | Import from Databricks Unity Catalog | partial |
1492
+ | `excel` | Import from ODCS Excel Template | ✅ |
1395
1493
  | Missing something? | Please create an issue on GitHub | TBD |
1396
1494
 
1397
1495
 
@@ -2078,6 +2176,7 @@ We are happy to receive your contributions. Propose your change in an issue or d
2078
2176
 
2079
2177
  ## Companies using this tool
2080
2178
 
2179
+ - [Entropy Data](https://www.entropy-data.com)
2081
2180
  - [INNOQ](https://innoq.com)
2082
2181
  - [Data Catering](https://data.catering/)
2083
2182
  - [Oliver Wyman](https://www.oliverwyman.com/)
@@ -2096,7 +2195,7 @@ We are happy to receive your contributions. Propose your change in an issue or d
2096
2195
 
2097
2196
  ## Credits
2098
2197
 
2099
- Created by [Stefan Negele](https://www.linkedin.com/in/stefan-negele-573153112/) and [Jochen Christ](https://www.linkedin.com/in/jochenchrist/).
2198
+ Created by [Stefan Negele](https://www.linkedin.com/in/stefan-negele-573153112/), [Jochen Christ](https://www.linkedin.com/in/jochenchrist/), and [Simon Harrer]().
2100
2199
 
2101
2200
 
2102
2201
 
@@ -120,9 +120,15 @@ $ datacontract export --format odcs datacontract.yaml --output odcs.yaml
120
120
  # import ODCS to data contract
121
121
  $ datacontract import --format odcs odcs.yaml --output datacontract.yaml
122
122
 
123
- # import sql (other formats: avro, glue, bigquery, jsonschema ...)
123
+ # import sql (other formats: avro, glue, bigquery, jsonschema, excel ...)
124
124
  $ datacontract import --format sql --source my-ddl.sql --dialect postgres --output datacontract.yaml
125
125
 
126
+ # import from Excel template
127
+ $ datacontract import --format excel --source odcs.xlsx --output datacontract.yaml
128
+
129
+ # export to Excel template
130
+ $ datacontract export --format excel --output odcs.xlsx datacontract.yaml
131
+
126
132
  # find differences between two data contracts
127
133
  $ datacontract diff datacontract-v1.yaml datacontract-v2.yaml
128
134
 
@@ -216,6 +222,7 @@ A list of available extras:
216
222
 
217
223
  | Dependency | Installation Command |
218
224
  |-------------------------|--------------------------------------------|
225
+ | Amazon Athena | `pip install datacontract-cli[athena]` |
219
226
  | Avro Support | `pip install datacontract-cli[avro]` |
220
227
  | Google BigQuery | `pip install datacontract-cli[bigquery]` |
221
228
  | Databricks Integration | `pip install datacontract-cli[databricks]` |
@@ -360,6 +367,7 @@ Credentials are provided with environment variables.
360
367
  Supported server types:
361
368
 
362
369
  - [s3](#S3)
370
+ - [athena](#athena)
363
371
  - [bigquery](#bigquery)
364
372
  - [azure](#azure)
365
373
  - [sqlserver](#sqlserver)
@@ -370,6 +378,7 @@ Supported server types:
370
378
  - [kafka](#kafka)
371
379
  - [postgres](#postgres)
372
380
  - [trino](#trino)
381
+ - [api](#api)
373
382
  - [local](#local)
374
383
 
375
384
  Supported formats:
@@ -429,6 +438,41 @@ servers:
429
438
  | `DATACONTRACT_S3_SESSION_TOKEN` | `AQoDYXdzEJr...` | AWS temporary session token (optional) |
430
439
 
431
440
 
441
+ #### Athena
442
+
443
+ Data Contract CLI can test data in AWS Athena stored in S3.
444
+ Supports different file formats, such as Iceberg, Parquet, JSON, CSV...
445
+
446
+ ##### Example
447
+
448
+ datacontract.yaml
449
+ ```yaml
450
+ servers:
451
+ athena:
452
+ type: athena
453
+ catalog: awsdatacatalog # awsdatacatalog is the default setting
454
+ schema: icebergdemodb # in Athena, this is called "database"
455
+ regionName: eu-central-1
456
+ stagingDir: s3://my-bucket/athena-results/
457
+ models:
458
+ my_table: # corresponds to a table of view name
459
+ type: table
460
+ fields:
461
+ my_column_1: # corresponds to a column
462
+ type: string
463
+ config:
464
+ physicalType: varchar
465
+ ```
466
+
467
+ ##### Environment Variables
468
+
469
+ | Environment Variable | Example | Description |
470
+ |-------------------------------------|---------------------------------|----------------------------------------|
471
+ | `DATACONTRACT_S3_REGION` | `eu-central-1` | Region of Athena service |
472
+ | `DATACONTRACT_S3_ACCESS_KEY_ID` | `AKIAXV5Q5QABCDEFGH` | AWS Access Key ID |
473
+ | `DATACONTRACT_S3_SECRET_ACCESS_KEY` | `93S7LRrJcqLaaaa/XXXXXXXXXXXXX` | AWS Secret Access Key |
474
+ | `DATACONTRACT_S3_SESSION_TOKEN` | `AQoDYXdzEJr...` | AWS temporary session token (optional) |
475
+
432
476
 
433
477
  #### Google Cloud Storage (GCS)
434
478
 
@@ -796,6 +840,38 @@ models:
796
840
  | `DATACONTRACT_TRINO_PASSWORD` | `mysecretpassword` | Password |
797
841
 
798
842
 
843
+ #### API
844
+
845
+ Data Contract CLI can test APIs that return data in JSON format.
846
+ Currently, only GET requests are supported.
847
+
848
+ ##### Example
849
+
850
+ datacontract.yaml
851
+ ```yaml
852
+ servers:
853
+ api:
854
+ type: "api"
855
+ location: "https://api.example.com/path"
856
+ delimiter: none # new_line, array, or none (default)
857
+
858
+ models:
859
+ my_object: # corresponds to the root element of the JSON response
860
+ type: object
861
+ fields:
862
+ field1:
863
+ type: string
864
+ fields2:
865
+ type: number
866
+ ```
867
+
868
+ ##### Environment Variables
869
+
870
+ | Environment Variable | Example | Description |
871
+ |-----------------------------------------|------------------|---------------------------------------------------|
872
+ | `DATACONTRACT_API_HEADER_AUTHORIZATION` | `Bearer <token>` | The value for the `authorization` header. Optional. |
873
+
874
+
799
875
  #### Local
800
876
 
801
877
  Data Contract CLI can test local files in parquet, json, csv, or delta format.
@@ -839,7 +915,7 @@ models:
839
915
  │ terraform|avro-idl|sql|sql-query|mer │
840
916
  │ maid|html|go|bigquery|dbml|spark|sql │
841
917
  │ alchemy|data-caterer|dcs|markdown|ic │
842
- │ eberg|custom]
918
+ │ eberg|custom|excel]
843
919
  │ --output PATH Specify the file path where the │
844
920
  │ exported data will be saved. If no │
845
921
  │ path is provided, the output will be │
@@ -859,8 +935,10 @@ models:
859
935
  │ --engine TEXT [engine] The engine used for great │
860
936
  │ expection run. │
861
937
  │ [default: None] │
862
- │ --template PATH [custom] The file path of Jinja
863
- template.
938
+ │ --template PATH The file path or URL of a template.
939
+ For Excel format: path/URL to custom
940
+ │ Excel template. For custom format: │
941
+ │ path to Jinja template. │
864
942
  │ [default: None] │
865
943
  │ --help Show this message and exit. │
866
944
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
@@ -909,6 +987,7 @@ Available export options:
909
987
  | `dcs` | Export to Data Contract Specification in YAML format | ✅ |
910
988
  | `markdown` | Export to Markdown | ✅ |
911
989
  | `iceberg` | Export to an Iceberg JSON Schema Definition | partial |
990
+ | `excel` | Export to ODCS Excel Template | ✅ |
912
991
  | `custom` | Export to Custom format with Jinja | ✅ |
913
992
  | Missing something? | Please create an issue on GitHub | TBD |
914
993
 
@@ -1180,6 +1259,22 @@ FROM
1180
1259
  {{ ref('orders') }}
1181
1260
  ```
1182
1261
 
1262
+ #### ODCS Excel Templace
1263
+
1264
+ The `export` function converts a data contract into an ODCS (Open Data Contract Standard) Excel template. This creates a user-friendly Excel spreadsheet that can be used for authoring, sharing, and managing data contracts using the familiar Excel interface.
1265
+
1266
+ ```shell
1267
+ datacontract export --format excel --output datacontract.xlsx datacontract.yaml
1268
+ ```
1269
+
1270
+ The Excel format enables:
1271
+ - **User-friendly authoring**: Create and edit data contracts in Excel's familiar interface
1272
+ - **Easy sharing**: Distribute data contracts as standard Excel files
1273
+ - **Collaboration**: Enable non-technical stakeholders to contribute to data contract definitions
1274
+ - **Round-trip conversion**: Import Excel templates back to YAML data contracts
1275
+
1276
+ For more information about the Excel template structure, visit the [ODCS Excel Template repository](https://github.com/datacontract/open-data-contract-standard-excel-template).
1277
+
1183
1278
  ### import
1184
1279
  ```
1185
1280
 
@@ -1298,6 +1393,7 @@ Available import options:
1298
1393
  | `spark` | Import from Spark StructTypes, Variant | ✅ |
1299
1394
  | `sql` | Import from SQL DDL | ✅ |
1300
1395
  | `unity` | Import from Databricks Unity Catalog | partial |
1396
+ | `excel` | Import from ODCS Excel Template | ✅ |
1301
1397
  | Missing something? | Please create an issue on GitHub | TBD |
1302
1398
 
1303
1399
 
@@ -1984,6 +2080,7 @@ We are happy to receive your contributions. Propose your change in an issue or d
1984
2080
 
1985
2081
  ## Companies using this tool
1986
2082
 
2083
+ - [Entropy Data](https://www.entropy-data.com)
1987
2084
  - [INNOQ](https://innoq.com)
1988
2085
  - [Data Catering](https://data.catering/)
1989
2086
  - [Oliver Wyman](https://www.oliverwyman.com/)
@@ -2002,7 +2099,7 @@ We are happy to receive your contributions. Propose your change in an issue or d
2002
2099
 
2003
2100
  ## Credits
2004
2101
 
2005
- Created by [Stefan Negele](https://www.linkedin.com/in/stefan-negele-573153112/) and [Jochen Christ](https://www.linkedin.com/in/jochenchrist/).
2102
+ Created by [Stefan Negele](https://www.linkedin.com/in/stefan-negele-573153112/), [Jochen Christ](https://www.linkedin.com/in/jochenchrist/), and [Simon Harrer]().
2006
2103
 
2007
2104
 
2008
2105
 
@@ -210,12 +210,21 @@ def export(
210
210
  # TODO: this should be a subcommand
211
211
  template: Annotated[
212
212
  Optional[Path],
213
- typer.Option(help="[custom] The file path of Jinja template."),
213
+ typer.Option(
214
+ help="The file path or URL of a template. For Excel format: path/URL to custom Excel template. For custom format: path to Jinja template."
215
+ ),
214
216
  ] = None,
215
217
  ):
216
218
  """
217
219
  Convert data contract to a specific format. Saves to file specified by `output` option if present, otherwise prints to stdout.
218
220
  """
221
+ # Validate that Excel format requires an output file path
222
+ if format == ExportFormat.excel and output is None:
223
+ console.print("❌ Error: Excel export requires an output file path.")
224
+ console.print("💡 Hint: Use --output to specify where to save the Excel file, e.g.:")
225
+ console.print(" datacontract export --format excel --output datacontract.xlsx")
226
+ raise typer.Exit(code=1)
227
+
219
228
  # TODO exception handling
220
229
  result = DataContract(data_contract_file=location, schema_location=schema, server=server).export(
221
230
  export_format=format,
@@ -230,8 +239,13 @@ def export(
230
239
  if output is None:
231
240
  console.print(result, markup=False, soft_wrap=True)
232
241
  else:
233
- with output.open(mode="w", encoding="utf-8") as f:
234
- f.write(result)
242
+ if isinstance(result, bytes):
243
+ # If the result is bytes, we assume it's a binary file (e.g., Excel, PDF)
244
+ with output.open(mode="wb") as f:
245
+ f.write(result)
246
+ else:
247
+ with output.open(mode="w", encoding="utf-8") as f:
248
+ f.write(result)
235
249
  console.print(f"Written result to {output}")
236
250
 
237
251
 
@@ -482,13 +496,14 @@ def _get_uvicorn_arguments(port: int, host: str, context: typer.Context) -> dict
482
496
  }
483
497
 
484
498
  # Create a list of the extra arguments, remove the leading -- from the cli arguments
485
- trimmed_keys = list(map(lambda x : str(x).replace("--", ""),context.args[::2]))
499
+ trimmed_keys = list(map(lambda x: str(x).replace("--", ""), context.args[::2]))
486
500
  # Merge the two dicts and return them as one dict
487
501
  return default_args | dict(zip(trimmed_keys, context.args[1::2]))
488
502
 
503
+
489
504
  @app.command(context_settings={"allow_extra_args": True, "ignore_unknown_options": True})
490
505
  def api(
491
- ctx: Annotated[typer.Context, typer.Option(help="Extra arguments to pass to uvicorn.run().")],
506
+ ctx: Annotated[typer.Context, typer.Option(help="Extra arguments to pass to uvicorn.run().")],
492
507
  port: Annotated[int, typer.Option(help="Bind socket to this port.")] = 4242,
493
508
  host: Annotated[
494
509
  str, typer.Option(help="Bind socket to this host. Hint: For running in docker, set it to 0.0.0.0")
@@ -250,8 +250,14 @@ class DataContract:
250
250
  inline_quality=self._inline_quality,
251
251
  )
252
252
 
253
- def export(self, export_format: ExportFormat, model: str = "all", sql_server_type: str = "auto", **kwargs) -> str:
254
- if export_format == ExportFormat.html or export_format == ExportFormat.mermaid:
253
+ def export(
254
+ self, export_format: ExportFormat, model: str = "all", sql_server_type: str = "auto", **kwargs
255
+ ) -> str | bytes:
256
+ if (
257
+ export_format == ExportFormat.html
258
+ or export_format == ExportFormat.mermaid
259
+ or export_format == ExportFormat.excel
260
+ ):
255
261
  data_contract = resolve.resolve_data_contract_v2(
256
262
  self._data_contract_file,
257
263
  self._data_contract_str,