datacontract-cli 1.1.3__tar.gz → 1.2.1__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 (538) hide show
  1. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/MANIFEST.in +1 -1
  2. {datacontract_cli-1.1.3/datacontract_cli.egg-info → datacontract_cli-1.2.1}/PKG-INFO +49 -41
  3. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/README.md +30 -30
  4. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/api.py +48 -73
  5. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/breaking/detector.py +32 -3
  6. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/breaking/rules.py +86 -2
  7. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/catalog/catalog.py +3 -1
  8. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/changelog/changelog.py +13 -1
  9. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/changelog/normalize.py +77 -11
  10. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/cli.py +57 -1
  11. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_api.py +1 -1
  12. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_breaking.py +2 -8
  13. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_changelog.py +2 -8
  14. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_ci.py +2 -7
  15. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_export.py +28 -10
  16. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_import.py +31 -5
  17. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_lint.py +9 -8
  18. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_test.py +3 -46
  19. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/config/settings.py +118 -17
  20. datacontract_cli-1.2.1/datacontract/config/variables.py +133 -0
  21. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/data_contract.py +23 -5
  22. datacontract_cli-1.2.1/datacontract/editor_assets/VERSION +1 -0
  23. datacontract_cli-1.2.1/datacontract/editor_assets/assets/editor.worker-4.7.0.js +33 -0
  24. datacontract_cli-1.2.1/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +452 -0
  25. datacontract_cli-1.2.1/datacontract/editor_assets/datacontract-editor.css +2 -0
  26. datacontract_cli-1.2.1/datacontract/editor_assets/datacontract-editor.es.js +84438 -0
  27. datacontract_cli-1.2.1/datacontract/editor_assets/index.html +81 -0
  28. datacontract_cli-1.2.1/datacontract/editor_assets/monaco-4.7.0.js +114821 -0
  29. datacontract_cli-1.2.1/datacontract/editor_assets/robots.txt +17 -0
  30. datacontract_cli-1.2.1/datacontract/editor_assets/rolldown-runtime-DY7j01NX.js +30 -0
  31. datacontract_cli-1.2.1/datacontract/editor_assets/sitemap.xml +17 -0
  32. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/create_checks.py +141 -31
  33. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/dimensions.py +2 -0
  34. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/physical_type_match.py +44 -4
  35. datacontract_cli-1.2.1/datacontract/engines/checks/severity.py +11 -0
  36. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/sql_guard.py +5 -0
  37. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/type_normalize.py +76 -6
  38. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/data_contract_test.py +63 -0
  39. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/fastjsonschema/check_jsonschema.py +7 -5
  40. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +3 -1
  41. datacontract_cli-1.2.1/datacontract/engines/hana/check_hana_execute.py +105 -0
  42. datacontract_cli-1.2.1/datacontract/engines/hana/hana_check_selection.py +76 -0
  43. datacontract_cli-1.2.1/datacontract/engines/hana/hana_connection.py +63 -0
  44. datacontract_cli-1.2.1/datacontract/engines/hana/hana_quality_check.py +707 -0
  45. datacontract_cli-1.2.1/datacontract/engines/hana/hana_schema_check.py +607 -0
  46. datacontract_cli-1.2.1/datacontract/engines/hana/hana_type_mapping.py +205 -0
  47. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/connect.py +133 -16
  48. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/duckdb_connection.py +44 -6
  49. datacontract_cli-1.2.1/datacontract/engines/ibis/connections/exasol_patch.py +24 -0
  50. datacontract_cli-1.2.1/datacontract/engines/ibis/connections/iceberg.py +216 -0
  51. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/kafka.py +15 -3
  52. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/dtype_category.py +17 -15
  53. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/ibis_check_execute.py +287 -74
  54. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/native_type.py +21 -0
  55. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/snowflake_structured_types.py +9 -4
  56. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/avro_exporter.py +36 -50
  57. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/avro_idl_exporter.py +36 -0
  58. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/bigquery_exporter.py +6 -1
  59. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/data_caterer_exporter.py +2 -28
  60. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/dcs_exporter.py +22 -2
  61. datacontract_cli-1.2.1/datacontract/export/excel_exporter.py +1119 -0
  62. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/exporter.py +6 -1
  63. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/go_exporter.py +15 -0
  64. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/great_expectations_exporter.py +75 -52
  65. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/html_exporter.py +3 -1
  66. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/iceberg_exporter.py +14 -30
  67. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/jsonschema_exporter.py +20 -26
  68. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/protobuf_exporter.py +29 -4
  69. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/pydantic_exporter.py +30 -0
  70. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/rdf_exporter.py +44 -9
  71. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/sodacl_check_builder.py +16 -4
  72. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/spark_exporter.py +14 -20
  73. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/sql_type_converter.py +94 -16
  74. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/sqlalchemy_exporter.py +5 -0
  75. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/athena_importer.py +2 -1
  76. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/avro_importer.py +15 -13
  77. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/csv_importer.py +20 -6
  78. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/dbml_importer.py +2 -0
  79. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/dbt_importer.py +10 -8
  80. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/dcs_importer.py +15 -26
  81. datacontract_cli-1.2.1/datacontract/imports/excel_importer.py +1070 -0
  82. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/glue_importer.py +15 -6
  83. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/iceberg_importer.py +73 -22
  84. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/jsonschema_importer.py +2 -12
  85. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/mysql_importer.py +8 -1
  86. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/object_storage_importer.py +9 -2
  87. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/odcs_helper.py +149 -41
  88. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/oracle_importer.py +8 -1
  89. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/parquet_importer.py +17 -1
  90. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/postgres_importer.py +12 -2
  91. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/powerbi_importer.py +15 -6
  92. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/protobuf_importer.py +2 -1
  93. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/pydantic_importer.py +4 -4
  94. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/redshift_importer.py +8 -1
  95. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/snowflake_importer.py +12 -2
  96. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/spark_importer.py +9 -3
  97. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/spark_type_json.py +14 -3
  98. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/sql_importer.py +92 -22
  99. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/sqlserver_importer.py +8 -1
  100. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/trino_importer.py +8 -1
  101. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/unity_importer.py +22 -11
  102. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/init/init_template.py +4 -2
  103. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/integration/dbt_sync.py +54 -13
  104. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/integration/dbt_test_mapping.py +3 -28
  105. datacontract_cli-1.2.1/datacontract/lint/constraints.py +50 -0
  106. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/resolve.py +162 -47
  107. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/schema.py +5 -3
  108. datacontract_cli-1.2.1/datacontract/model/enum_values.py +60 -0
  109. datacontract_cli-1.2.1/datacontract/model/map_type.py +74 -0
  110. datacontract_cli-1.2.1/datacontract/model/natural_keys.py +18 -0
  111. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/run.py +6 -3
  112. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/server.py +24 -0
  113. datacontract_cli-1.2.1/datacontract/model/vector_type.py +110 -0
  114. datacontract_cli-1.2.1/datacontract/model/workbook.py +260 -0
  115. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/text_breaking_results.py +9 -5
  116. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/text_changelog_results.py +8 -4
  117. datacontract_cli-1.1.3/datacontract/schemas/odcs-3.1.0.init.yaml → datacontract_cli-1.2.1/datacontract/schemas/odcs-3.2.0.init.yaml +1 -1
  118. datacontract_cli-1.1.3/datacontract/schemas/odcs-3.0.1.schema.json → datacontract_cli-1.2.1/datacontract/schemas/odcs-3.2.0.schema.json +1627 -143
  119. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/datacontract_odcs.html +1 -0
  120. datacontract_cli-1.1.3/datacontract/templates/excel/odcs-template.xlsx → datacontract_cli-1.2.1/datacontract/templates/excel/odcs-template-v3.0.xlsx +0 -0
  121. datacontract_cli-1.2.1/datacontract/templates/excel/odcs-template-v3.1.xlsx +0 -0
  122. datacontract_cli-1.2.1/datacontract/templates/excel/odcs-template-v3.2.xlsx +0 -0
  123. datacontract_cli-1.2.1/datacontract/templates/macros/context.html +64 -0
  124. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/macros/schema.html +41 -0
  125. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/macros/server.html +11 -1
  126. datacontract_cli-1.2.1/datacontract/templates/partials_odcs/context.html +16 -0
  127. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/custom_properties.html +3 -0
  128. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/schema.html +17 -0
  129. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/sla.html +30 -0
  130. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1/datacontract_cli.egg-info}/PKG-INFO +49 -41
  131. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract_cli.egg-info/SOURCES.txt +51 -89
  132. datacontract_cli-1.2.1/datacontract_cli.egg-info/dependency_links.txt +1 -0
  133. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract_cli.egg-info/requires.txt +20 -10
  134. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/pyproject.toml +33 -11
  135. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_api.py +112 -17
  136. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_breaking.py +153 -0
  137. datacontract_cli-1.2.1/tests/test_breaking_odcs_3_2.py +94 -0
  138. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_changelog.py +53 -0
  139. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_changelog_normalize.py +7 -7
  140. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_changelog_output_text.py +25 -6
  141. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_cli.py +10 -1
  142. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_command_api.py +14 -0
  143. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_config_file.py +7 -0
  144. datacontract_cli-1.2.1/tests/test_connect_exasol.py +117 -0
  145. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_sqlserver.py +85 -9
  146. datacontract_cli-1.2.1/tests/test_create_checks_nested.py +187 -0
  147. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_nested_type.py +49 -12
  148. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_servicelevel.py +60 -0
  149. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_dbt_sync.py +116 -4
  150. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_dtype_category.py +13 -5
  151. datacontract_cli-1.2.1/tests/test_enum_values.py +177 -0
  152. datacontract_cli-1.2.1/tests/test_export_excel.py +465 -0
  153. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_great_expectations.py +108 -0
  154. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_odcs_v3.py +10 -0
  155. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_rdf.py +37 -30
  156. datacontract_cli-1.2.1/tests/test_hana_connection.py +99 -0
  157. datacontract_cli-1.2.1/tests/test_hana_quality_check.py +422 -0
  158. datacontract_cli-1.2.1/tests/test_hana_schema_check.py +436 -0
  159. datacontract_cli-1.2.1/tests/test_hana_type_mapping.py +94 -0
  160. datacontract_cli-1.2.1/tests/test_ibis_check_execute.py +152 -0
  161. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_athena.py +1 -1
  162. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_avro.py +53 -18
  163. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_csv.py +10 -2
  164. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_dbt.py +10 -0
  165. datacontract_cli-1.2.1/tests/test_import_excel.py +124 -0
  166. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_iceberg.py +65 -18
  167. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_mysql.py +1 -1
  168. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_object_storage.py +47 -0
  169. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_parquet.py +11 -2
  170. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_postgres.py +2 -1
  171. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_powerbi.py +1 -2
  172. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_pydantic_model.py +12 -0
  173. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_redshift.py +2 -1
  174. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_snowflake.py +1 -1
  175. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_spark_type_json.py +3 -3
  176. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_sql_oracle.py +7 -2
  177. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_sql_postgres.py +32 -2
  178. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_sql_snowflake.py +17 -1
  179. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_sql_sqlserver.py +3 -1
  180. datacontract_cli-1.2.1/tests/test_import_unmapped_types.py +94 -0
  181. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_install_extras.py +2 -0
  182. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_lint.py +64 -0
  183. datacontract_cli-1.2.1/tests/test_lint_odcs_3_2_constraints.py +94 -0
  184. datacontract_cli-1.2.1/tests/test_map_type.py +313 -0
  185. datacontract_cli-1.2.1/tests/test_metadata_fields.py +128 -0
  186. datacontract_cli-1.2.1/tests/test_nested_path_checks.py +102 -0
  187. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_physical_type_match.py +38 -0
  188. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_resolve_definitions.py +18 -1
  189. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_roundtrip_pydantic_model.py +4 -31
  190. datacontract_cli-1.2.1/tests/test_row_filter_duplicate_count.py +61 -0
  191. datacontract_cli-1.2.1/tests/test_servers_3_2_0.py +143 -0
  192. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_snowflake_structured_types.py +12 -7
  193. datacontract_cli-1.2.1/tests/test_test_hana.py +415 -0
  194. datacontract_cli-1.2.1/tests/test_test_iceberg.py +347 -0
  195. datacontract_cli-1.2.1/tests/test_test_iceberg_rest.py +187 -0
  196. datacontract_cli-1.2.1/tests/test_test_iceberg_s3tables.py +164 -0
  197. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_parquet.py +1 -1
  198. datacontract_cli-1.2.1/tests/test_test_variables.py +159 -0
  199. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_untrusted_contract.py +17 -0
  200. datacontract_cli-1.2.1/tests/test_variables.py +157 -0
  201. datacontract_cli-1.2.1/tests/test_vector_type.py +338 -0
  202. datacontract_cli-1.1.3/datacontract/editor_assets/VERSION +0 -1
  203. datacontract_cli-1.1.3/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -1398
  204. datacontract_cli-1.1.3/datacontract/editor_assets/apex-Dspwrl5m.js +0 -326
  205. datacontract_cli-1.1.3/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -9037
  206. datacontract_cli-1.1.3/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -26455
  207. datacontract_cli-1.1.3/datacontract/editor_assets/azcli-k1BiOau1.js +0 -68
  208. datacontract_cli-1.1.3/datacontract/editor_assets/bat-BIP72KWc.js +0 -100
  209. datacontract_cli-1.1.3/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -102
  210. datacontract_cli-1.1.3/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -174
  211. datacontract_cli-1.1.3/datacontract/editor_assets/clojure-BAuDPsal.js +0 -761
  212. datacontract_cli-1.1.3/datacontract/editor_assets/coffee-BV06qSnj.js +0 -232
  213. datacontract_cli-1.1.3/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -389
  214. datacontract_cli-1.1.3/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -326
  215. datacontract_cli-1.1.3/datacontract/editor_assets/csp-KzlEHCyI.js +0 -53
  216. datacontract_cli-1.1.3/datacontract/editor_assets/css-e4FKntZ3.js +0 -187
  217. datacontract_cli-1.1.3/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -1618
  218. datacontract_cli-1.1.3/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -263
  219. datacontract_cli-1.1.3/datacontract/editor_assets/dart-DdHeFWR0.js +0 -281
  220. datacontract_cli-1.1.3/datacontract/editor_assets/datacontract-editor.css +0 -1
  221. datacontract_cli-1.1.3/datacontract/editor_assets/datacontract-editor.es.js +0 -78027
  222. datacontract_cli-1.1.3/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -130
  223. datacontract_cli-1.1.3/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -456
  224. datacontract_cli-1.1.3/datacontract/editor_assets/elixir-C9X42b0T.js +0 -569
  225. datacontract_cli-1.1.3/datacontract/editor_assets/flow9-Bff42pfB.js +0 -142
  226. datacontract_cli-1.1.3/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -989
  227. datacontract_cli-1.1.3/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -217
  228. datacontract_cli-1.1.3/datacontract/editor_assets/go-DEr8zx9f.js +0 -218
  229. datacontract_cli-1.1.3/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -151
  230. datacontract_cli-1.1.3/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -419
  231. datacontract_cli-1.1.3/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -183
  232. datacontract_cli-1.1.3/datacontract/editor_assets/html-Cn4TGw_o.js +0 -308
  233. datacontract_cli-1.1.3/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -1628
  234. datacontract_cli-1.1.3/datacontract/editor_assets/index.html +0 -31
  235. datacontract_cli-1.1.3/datacontract/editor_assets/ini-CZGtssYM.js +0 -71
  236. datacontract_cli-1.1.3/datacontract/editor_assets/java-B260NeH3.js +0 -232
  237. datacontract_cli-1.1.3/datacontract/editor_assets/javascript-B86Kac07.js +0 -70
  238. datacontract_cli-1.1.3/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -2051
  239. datacontract_cli-1.1.3/datacontract/editor_assets/julia-kuNLM9c5.js +0 -511
  240. datacontract_cli-1.1.3/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -253
  241. datacontract_cli-1.1.3/datacontract/editor_assets/less-AZUtS89I.js +0 -162
  242. datacontract_cli-1.1.3/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -157
  243. datacontract_cli-1.1.3/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -240
  244. datacontract_cli-1.1.3/datacontract/editor_assets/lua-Dz1RbATg.js +0 -162
  245. datacontract_cli-1.1.3/datacontract/editor_assets/m3-CIMooLFn.js +0 -210
  246. datacontract_cli-1.1.3/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -229
  247. datacontract_cli-1.1.3/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -165
  248. datacontract_cli-1.1.3/datacontract/editor_assets/mips-BovsnfLQ.js +0 -198
  249. datacontract_cli-1.1.3/datacontract/editor_assets/monaco-4.7.0.js +0 -125918
  250. datacontract_cli-1.1.3/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -375
  251. datacontract_cli-1.1.3/datacontract/editor_assets/mysql-BwdpPE19.js +0 -878
  252. datacontract_cli-1.1.3/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -183
  253. datacontract_cli-1.1.3/datacontract/editor_assets/pascal--j5-PYtz.js +0 -251
  254. datacontract_cli-1.1.3/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -164
  255. datacontract_cli-1.1.3/datacontract/editor_assets/perl-BzEWqUb5.js +0 -626
  256. datacontract_cli-1.1.3/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -851
  257. datacontract_cli-1.1.3/datacontract/editor_assets/php-A19QHzQV.js +0 -500
  258. datacontract_cli-1.1.3/datacontract/editor_assets/pla-COeKY1hA.js +0 -137
  259. datacontract_cli-1.1.3/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -907
  260. datacontract_cli-1.1.3/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -890
  261. datacontract_cli-1.1.3/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -239
  262. datacontract_cli-1.1.3/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -420
  263. datacontract_cli-1.1.3/datacontract/editor_assets/pug-DLej6kn5.js +0 -402
  264. datacontract_cli-1.1.3/datacontract/editor_assets/python-C8RW9B6A.js +0 -301
  265. datacontract_cli-1.1.3/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -301
  266. datacontract_cli-1.1.3/datacontract/editor_assets/r-D-F4P80w.js +0 -243
  267. datacontract_cli-1.1.3/datacontract/editor_assets/razor-CLZqdY_r.js +0 -550
  268. datacontract_cli-1.1.3/datacontract/editor_assets/redis-hwwIlMnV.js +0 -302
  269. datacontract_cli-1.1.3/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -809
  270. datacontract_cli-1.1.3/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -174
  271. datacontract_cli-1.1.3/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -511
  272. datacontract_cli-1.1.3/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -343
  273. datacontract_cli-1.1.3/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -115
  274. datacontract_cli-1.1.3/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -370
  275. datacontract_cli-1.1.3/datacontract/editor_assets/scheme-DeFRbslr.js +0 -108
  276. datacontract_cli-1.1.3/datacontract/editor_assets/scss-RSTCiCmI.js +0 -262
  277. datacontract_cli-1.1.3/datacontract/editor_assets/shell-BpF-iNu8.js +0 -221
  278. datacontract_cli-1.1.3/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -1367
  279. datacontract_cli-1.1.3/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -199
  280. datacontract_cli-1.1.3/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -201
  281. datacontract_cli-1.1.3/datacontract/editor_assets/sql-CJwKPERn.js +0 -853
  282. datacontract_cli-1.1.3/datacontract/editor_assets/st-DPlKG5DT.js +0 -416
  283. datacontract_cli-1.1.3/datacontract/editor_assets/swift-YZBAbVHV.js +0 -309
  284. datacontract_cli-1.1.3/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -576
  285. datacontract_cli-1.1.3/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -232
  286. datacontract_cli-1.1.3/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -933
  287. datacontract_cli-1.1.3/datacontract/editor_assets/twig-C5TO7-kw.js +0 -392
  288. datacontract_cli-1.1.3/datacontract/editor_assets/typescript-CJBeebKU.js +0 -343
  289. datacontract_cli-1.1.3/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -117
  290. datacontract_cli-1.1.3/datacontract/editor_assets/vb-ChHvIDrk.js +0 -372
  291. datacontract_cli-1.1.3/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -439
  292. datacontract_cli-1.1.3/datacontract/editor_assets/xml-vC-NMVX1.js +0 -95
  293. datacontract_cli-1.1.3/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -206
  294. datacontract_cli-1.1.3/datacontract/export/excel_exporter.py +0 -993
  295. datacontract_cli-1.1.3/datacontract/imports/excel_importer.py +0 -1116
  296. datacontract_cli-1.1.3/tests/test_export_excel.py +0 -164
  297. datacontract_cli-1.1.3/tests/test_import_excel.py +0 -40
  298. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/LICENSE +0 -0
  299. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/__init__.py +0 -0
  300. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/breaking/__init__.py +0 -0
  301. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/changelog/__init__.py +0 -0
  302. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_catalog.py +0 -0
  303. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_dbt.py +0 -0
  304. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_edit.py +0 -0
  305. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_init.py +0 -0
  306. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/command_publish.py +0 -0
  307. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/config/__init__.py +0 -0
  308. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/config/cli_context.py +0 -0
  309. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  310. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/editor_assets/odcs.svg +0 -0
  311. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/__init__.py +0 -0
  312. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/__init__.py +0 -0
  313. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/check_filter.py +0 -0
  314. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/checks/check_spec.py +0 -0
  315. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/datacontract/check_azure_blob_file.py +0 -0
  316. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  317. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  318. /datacontract_cli-1.1.3/datacontract_cli.egg-info/dependency_links.txt → /datacontract_cli-1.2.1/datacontract/engines/hana/__init__.py +0 -0
  319. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/__init__.py +0 -0
  320. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/__init__.py +0 -0
  321. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/aws_credentials.py +0 -0
  322. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/databricks_patch.py +0 -0
  323. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
  324. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/redshift_credentials.py +0 -0
  325. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
  326. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/__init__.py +0 -0
  327. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/custom_exporter.py +0 -0
  328. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/dbml_exporter.py +0 -0
  329. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/dbt_exporter.py +0 -0
  330. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/dqx_exporter.py +0 -0
  331. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/duckdb_type_converter.py +0 -0
  332. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/exporter_factory.py +0 -0
  333. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/markdown_exporter.py +0 -0
  334. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/mermaid_exporter.py +0 -0
  335. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/odcs_v3_exporter.py +0 -0
  336. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/pandas_type_converter.py +0 -0
  337. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/sodacl_exporter.py +0 -0
  338. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/export/sql_exporter.py +0 -0
  339. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/bigquery_importer.py +0 -0
  340. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/importer.py +0 -0
  341. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/importer_factory.py +0 -0
  342. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/json_importer.py +0 -0
  343. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/imports/odcs_importer.py +0 -0
  344. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/integration/entropy_data.py +0 -0
  345. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/files.py +0 -0
  346. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/resources.py +0 -0
  347. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/s3.py +0 -0
  348. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/lint/urls.py +0 -0
  349. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/breaking.py +0 -0
  350. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/changelog.py +0 -0
  351. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/exceptions.py +0 -0
  352. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/model/odcs.py +0 -0
  353. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/__init__.py +0 -0
  354. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/ci_output.py +0 -0
  355. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/json_test_results.py +0 -0
  356. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/junit_test_results.py +0 -0
  357. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/output_format.py +0 -0
  358. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/output/test_results_writer.py +0 -0
  359. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/py.typed +0 -0
  360. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  361. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  362. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  363. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  364. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  365. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  366. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  367. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  368. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/datacontract.html +0 -0
  369. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/index.html +0 -0
  370. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/macros/authoritative_definitions.html +0 -0
  371. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/macros/support.html +0 -0
  372. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/datacontract_information.html +0 -0
  373. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  374. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/datacontract_terms.html +0 -0
  375. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/definition.html +0 -0
  376. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/example.html +0 -0
  377. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/model_field.html +0 -0
  378. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/quality.html +0 -0
  379. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials/server.html +0 -0
  380. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/diagram.html +0 -0
  381. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/dialog_yaml.html +0 -0
  382. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/footer.html +0 -0
  383. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/fundamentals.html +0 -0
  384. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/header.html +0 -0
  385. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/pricing.html +0 -0
  386. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/roles.html +0 -0
  387. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/servers.html +0 -0
  388. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/support.html +0 -0
  389. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/team.html +0 -0
  390. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/term_of_use.html +0 -0
  391. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/partials_odcs/title.html +0 -0
  392. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract/templates/style/output.css +0 -0
  393. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract_cli.egg-info/entry_points.txt +0 -0
  394. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/datacontract_cli.egg-info/top_level.txt +0 -0
  395. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/setup.cfg +0 -0
  396. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_api_openapi.py +0 -0
  397. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_catalog.py +0 -0
  398. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_changelog_engine.py +0 -0
  399. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_check_quality_provenance.py +0 -0
  400. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_ci_output.py +0 -0
  401. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_config.py +0 -0
  402. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_config_require.py +0 -0
  403. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_config_threading.py +0 -0
  404. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_athena.py +0 -0
  405. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_bigquery.py +0 -0
  406. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_databricks.py +0 -0
  407. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_impala.py +0 -0
  408. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_mysql.py +0 -0
  409. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_oracle.py +0 -0
  410. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_postgres.py +0 -0
  411. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_redshift.py +0 -0
  412. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_s3_credentials.py +0 -0
  413. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_snowflake.py +0 -0
  414. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_connect_trino.py +0 -0
  415. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_array_items.py +0 -0
  416. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_physical_type.py +0 -0
  417. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_primary_key.py +0 -0
  418. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_retention_period.py +0 -0
  419. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_create_checks_sql_placeholders.py +0 -0
  420. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_data_contract.py +0 -0
  421. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_data_contract_checks.py +0 -0
  422. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_data_contract_specification.py +0 -0
  423. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_dbt_test_mapping.py +0 -0
  424. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_description_linter.py +0 -0
  425. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_docs_commands.py +0 -0
  426. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_docs_config_options.py +0 -0
  427. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_docs_ordering.py +0 -0
  428. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_download_datacontract_file.py +0 -0
  429. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_duckdb_json.py +0 -0
  430. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_edit.py +0 -0
  431. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_avro.py +0 -0
  432. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_avro_idl.py +0 -0
  433. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_bigquery.py +0 -0
  434. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_complex_data_contract.py +0 -0
  435. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_custom.py +0 -0
  436. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_custom_exporter.py +0 -0
  437. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_custom_model.py +0 -0
  438. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_data_caterer.py +0 -0
  439. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dbml.py +0 -0
  440. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dbt_models.py +0 -0
  441. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dbt_sources.py +0 -0
  442. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dbt_staging_sql.py +0 -0
  443. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dcs.py +0 -0
  444. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_dqx.py +0 -0
  445. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_go.py +0 -0
  446. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_html.py +0 -0
  447. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_iceberg.py +0 -0
  448. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_jsonschema.py +0 -0
  449. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_large_contract.py +0 -0
  450. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_markdown.py +0 -0
  451. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_mermaid.py +0 -0
  452. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_protobuf.py +0 -0
  453. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_pydantic.py +0 -0
  454. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_sodacl.py +0 -0
  455. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_spark.py +0 -0
  456. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_sql.py +0 -0
  457. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_sql_clickhouse.py +0 -0
  458. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_sql_query.py +0 -0
  459. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_export_sqlalchemy.py +0 -0
  460. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_ibis_mssql_pattern.py +0 -0
  461. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_ibis_mssql_schema.py +0 -0
  462. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_ibis_oracle_schema.py +0 -0
  463. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_bigquery.py +0 -0
  464. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_dbml.py +0 -0
  465. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_glue.py +0 -0
  466. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_json.py +0 -0
  467. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_jsonschema.py +0 -0
  468. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_odcs_v3.py +0 -0
  469. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_oracle.py +0 -0
  470. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_protobuf.py +0 -0
  471. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_sqlserver.py +0 -0
  472. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_trino.py +0 -0
  473. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_import_unity_file.py +0 -0
  474. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_integration_entropydata.py +0 -0
  475. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_lint_urls.py +0 -0
  476. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_native_type_schema_scope.py +0 -0
  477. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_oracle_patch.py +0 -0
  478. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_publish_test_results.py +0 -0
  479. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_publish_test_results_payload.py +0 -0
  480. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_quality_sql_dialects.py +0 -0
  481. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_redshift_credentials.py +0 -0
  482. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_redshift_patch.py +0 -0
  483. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_resolve.py +0 -0
  484. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_resolve_local_definitions.py +0 -0
  485. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_roundtrip_jsonschema.py +0 -0
  486. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_run_check_deprecated_fields.py +0 -0
  487. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_run_check_engine.py +0 -0
  488. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_server_overrides.py +0 -0
  489. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_server_type_mssql.py +0 -0
  490. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_server_type_synonyms.py +0 -0
  491. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_sql_type_converter_physicaltype.py +0 -0
  492. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_api.py +0 -0
  493. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_array_items.py +0 -0
  494. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_athena_iceberg.py +0 -0
  495. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_azure_blob_file.py +0 -0
  496. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_azure_remote.py +0 -0
  497. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_bigquery.py +0 -0
  498. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_checks_filter.py +0 -0
  499. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_databricks.py +0 -0
  500. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_delta.py +0 -0
  501. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_diagnostics.py +0 -0
  502. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_dimension_filter.py +0 -0
  503. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_dry_run.py +0 -0
  504. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_duckdb.py +0 -0
  505. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_failed_samples.py +0 -0
  506. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_gcs_csv_remote.py +0 -0
  507. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_gcs_json_remote.py +0 -0
  508. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_kafka.py +0 -0
  509. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_kafka_decoding.py +0 -0
  510. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_kafka_remote.py +0 -0
  511. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_local_json.py +0 -0
  512. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_local_json_nd.py +0 -0
  513. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_metadata_only.py +0 -0
  514. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_mysql.py +0 -0
  515. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_oracle.py +0 -0
  516. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_oracle_xe.py +0 -0
  517. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_output_json.py +0 -0
  518. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_output_junit.py +0 -0
  519. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_postgres.py +0 -0
  520. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_quality.py +0 -0
  521. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_quality_id_and_tag_filter.py +0 -0
  522. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_quality_local_fallback.py +0 -0
  523. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_quality_percent_severity.py +0 -0
  524. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_redshift.py +0 -0
  525. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_row_filter.py +0 -0
  526. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_csv.py +0 -0
  527. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_delta.py +0 -0
  528. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_json.py +0 -0
  529. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_json_complex.py +0 -0
  530. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_json_multiple_models.py +0 -0
  531. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_s3_json_remote.py +0 -0
  532. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_schema_evolution.py +0 -0
  533. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_server_not_found.py +0 -0
  534. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_snowflake.py +0 -0
  535. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_soda_connection_error.py +0 -0
  536. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_sqlserver.py +0 -0
  537. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_test_trino.py +0 -0
  538. {datacontract_cli-1.1.3 → datacontract_cli-1.2.1}/tests/test_type_normalize.py +0 -0
@@ -1,5 +1,5 @@
1
1
  include datacontract/templates/style/output.css
2
- include datacontract/templates/excel/odcs-template.xlsx
2
+ include datacontract/templates/excel/*.xlsx
3
3
  recursive-include datacontract/templates/ **/*.html
4
4
  recursive-include datacontract/schemas/ **/*.json **/*.yaml
5
5
  recursive-include datacontract/editor_assets/ *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.1.3
3
+ Version: 1.2.1
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@entropy-data.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@entropy-data.com>
6
6
  License-Expression: MIT
@@ -40,20 +40,20 @@ Requires-Dist: jsonschema<5.0.0,>=4.23.0
40
40
  Requires-Dist: pytz>=2024.1
41
41
  Requires-Dist: python-multipart<1.0.0,>=0.0.20
42
42
  Requires-Dist: rich<16.0,>=13.7
43
- Requires-Dist: sqlglot<31.0.0,>=26.6.0
43
+ Requires-Dist: sqlglot<30.18,>=26.6.0
44
44
  Requires-Dist: python-dotenv<2.0.0,>=1.0.0
45
45
  Requires-Dist: boto3<2.0.0,>=1.34.41
46
46
  Requires-Dist: Jinja2<4.0.0,>=3.1.5
47
47
  Requires-Dist: jinja_partials<1.0.0,>=0.2.1
48
48
  Requires-Dist: datacontract-specification<2.0.0,>=1.2.3
49
- Requires-Dist: open-data-contract-standard<3.2.0,>=3.1.2
49
+ Requires-Dist: open-data-contract-standard<3.3.0,>=3.2.0
50
50
  Requires-Dist: deepdiff<10.0.0,>=6.0.0
51
51
  Provides-Extra: avro
52
52
  Requires-Dist: avro==1.12.2; extra == "avro"
53
53
  Provides-Extra: bigquery
54
54
  Requires-Dist: ibis-framework[bigquery]<13.0.0,>=10.0.0; extra == "bigquery"
55
55
  Provides-Extra: csv
56
- Requires-Dist: pandas>=2.0.0; extra == "csv"
56
+ Requires-Dist: datacontract-cli[duckdb]; extra == "csv"
57
57
  Provides-Extra: excel
58
58
  Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
59
59
  Provides-Extra: dataframe
@@ -66,13 +66,14 @@ Requires-Dist: pyarrow-hotfix>=0.4; extra == "dataframe"
66
66
  Requires-Dist: rich>=12.4.4; extra == "dataframe"
67
67
  Provides-Extra: databricks
68
68
  Requires-Dist: ibis-framework[databricks]<13.0.0,>=10.0.0; extra == "databricks"
69
- Requires-Dist: databricks-sql-connector<4.5.0,>=3.7.0; extra == "databricks"
70
- Requires-Dist: databricks-sdk<0.134.0; extra == "databricks"
69
+ Requires-Dist: databricks-sql-connector<4.6.0,>=3.7.0; extra == "databricks"
70
+ Requires-Dist: databricks-sdk<0.140.0; extra == "databricks"
71
71
  Requires-Dist: packaging<27.0,>=21.3; extra == "databricks"
72
72
  Provides-Extra: databricks-runtime
73
73
  Requires-Dist: datacontract-cli[databricks]; extra == "databricks-runtime"
74
74
  Provides-Extra: iceberg
75
- Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
75
+ Requires-Dist: pyiceberg[pyarrow,rest-sigv4]==0.12.0; extra == "iceberg"
76
+ Requires-Dist: datacontract-cli[duckdb]; extra == "iceberg"
76
77
  Provides-Extra: kafka
77
78
  Requires-Dist: datacontract-cli[duckdb,parquet]; extra == "kafka"
78
79
  Requires-Dist: confluent-kafka<3.0.0,>=2.6.0; extra == "kafka"
@@ -111,6 +112,13 @@ Requires-Dist: packaging<27.0,>=21.3; extra == "oracle"
111
112
  Provides-Extra: athena
112
113
  Requires-Dist: ibis-framework[athena]<13.0.0,>=10.0.0; extra == "athena"
113
114
  Requires-Dist: packaging<27.0,>=21.3; extra == "athena"
115
+ Provides-Extra: hana
116
+ Requires-Dist: hdbcli<3.0.0,>=2.20.0; extra == "hana"
117
+ Provides-Extra: exasol
118
+ Requires-Dist: ibis-framework[exasol]<13.0.0,>=10.0.0; extra == "exasol"
119
+ Requires-Dist: pyexasol>=1.1.0; extra == "exasol"
120
+ Requires-Dist: packaging<27.0,>=21.3; extra == "exasol"
121
+ Requires-Dist: sqlglot>=26.31.0; extra == "exasol"
114
122
  Provides-Extra: trino
115
123
  Requires-Dist: ibis-framework[trino]<13.0.0,>=10.0.0; extra == "trino"
116
124
  Requires-Dist: packaging<27.0,>=21.3; extra == "trino"
@@ -128,11 +136,11 @@ Provides-Extra: rdf
128
136
  Requires-Dist: rdflib==7.6.0; extra == "rdf"
129
137
  Provides-Extra: api
130
138
  Requires-Dist: fastapi<0.142.0,>=0.115.0; extra == "api"
131
- Requires-Dist: uvicorn<0.53.0,>=0.44.0; extra == "api"
139
+ Requires-Dist: uvicorn<0.54.0,>=0.44.0; extra == "api"
132
140
  Provides-Extra: protobuf
133
141
  Requires-Dist: proto-schema-parser<3.0,>=1.0; extra == "protobuf"
134
142
  Provides-Extra: all
135
- Requires-Dist: datacontract-cli[api,athena,avro,azure,bigquery,csv,databricks,dataframe,dbml,duckdb,excel,gcs,iceberg,impala,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,redshift,s3,snowflake,sqlserver,trino]; extra == "all"
143
+ Requires-Dist: datacontract-cli[api,athena,avro,azure,bigquery,csv,databricks,dataframe,dbml,duckdb,exasol,excel,gcs,iceberg,impala,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,redshift,s3,snowflake,sqlserver,trino]; extra == "all"
136
144
  Provides-Extra: dev
137
145
  Requires-Dist: datacontract-cli[all]; extra == "dev"
138
146
  Requires-Dist: httpx==0.28.1; extra == "dev"
@@ -145,10 +153,10 @@ Requires-Dist: pre-commit<4.7.0,>=3.7.1; extra == "dev"
145
153
  Requires-Dist: pytest; extra == "dev"
146
154
  Requires-Dist: pytest-cov; extra == "dev"
147
155
  Requires-Dist: pytest-xdist; extra == "dev"
148
- Requires-Dist: pymssql==2.3.13; extra == "dev"
156
+ Requires-Dist: pymssql==2.4.1; extra == "dev"
149
157
  Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
150
158
  Requires-Dist: mysql-connector-python<26.8.0,>=8.0.30; extra == "dev"
151
- Requires-Dist: ruff==0.16.5; extra == "dev"
159
+ Requires-Dist: ruff==0.16.8; extra == "dev"
152
160
  Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.15.0; extra == "dev"
153
161
  Requires-Dist: trino==0.339.0; extra == "dev"
154
162
  Dynamic: license-file
@@ -411,7 +419,7 @@ Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signin
411
419
  ## Optional Dependencies (Extras)
412
420
 
413
421
  The CLI tool defines several optional dependencies (also known as extras) that can be installed for using with specific servers types.
414
- With _all_, all server dependencies are included.
422
+ With _all_, all server dependencies except `hana` are included.
415
423
 
416
424
  ```bash
417
425
  uv tool install --python python3.11 --upgrade 'datacontract-cli[all]'
@@ -419,35 +427,35 @@ uv tool install --python python3.11 --upgrade 'datacontract-cli[all]'
419
427
 
420
428
  A list of available extras:
421
429
 
422
- | Dependency | Installation Command |
423
- |------------------------------------------|--------------------------------------------|
424
- | Amazon Athena | `pip install datacontract-cli[athena]` |
425
- | Avro Support | `pip install datacontract-cli[avro]` |
426
- | Azure Integration | `pip install datacontract-cli[azure]` |
427
- | Google BigQuery | `pip install datacontract-cli[bigquery]` |
428
- | CSV | `pip install datacontract-cli[csv]` |
429
- | Databricks Integration | `pip install datacontract-cli[databricks]` |
430
- | Databricks Runtime | `pip install datacontract-cli[databricks]` (also inside Databricks, using the cluster's own Spark session) |
431
- | DataFrame (Spark) | `pip install datacontract-cli[dataframe]` (PySpark not included — you supply the Spark session) |
432
- | DBML | `pip install datacontract-cli[dbml]` |
433
- | DuckDB (local/S3/GCS/Azure file testing) | `pip install datacontract-cli[duckdb]` |
434
- | Excel | `pip install datacontract-cli[excel]` |
435
- | GCS Integration | `pip install datacontract-cli[gcs]` |
436
- | Iceberg | `pip install datacontract-cli[iceberg]` |
437
- | Impala | `pip install datacontract-cli[impala]` |
438
- | Kafka Integration | `pip install datacontract-cli[kafka]` |
439
- | MySQL Integration | `pip install datacontract-cli[mysql]` |
440
- | Oracle | `pip install datacontract-cli[oracle]` |
441
- | Parquet | `pip install datacontract-cli[parquet]` |
442
- | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
443
- | protobuf | `pip install datacontract-cli[protobuf]` |
444
- | RDF | `pip install datacontract-cli[rdf]` |
445
- | Amazon Redshift | `pip install datacontract-cli[redshift]` |
446
- | S3 Integration | `pip install datacontract-cli[s3]` |
447
- | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
448
- | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
449
- | Trino | `pip install datacontract-cli[trino]` |
450
- | API (run as web server) | `pip install datacontract-cli[api]` |
430
+ | Dependency | Installation command |
431
+ |---|---|
432
+ | API (run as web server) | `pip install datacontract-cli[api]` |
433
+ | Amazon Athena | `pip install datacontract-cli[athena]` |
434
+ | Avro | `pip install datacontract-cli[avro]` |
435
+ | Azure | `pip install datacontract-cli[azure]` |
436
+ | Google BigQuery | `pip install datacontract-cli[bigquery]` |
437
+ | Databricks | `pip install datacontract-cli[databricks]` (also inside a Databricks Runtime, using the cluster's own Spark session) |
438
+ | DataFrame (Spark) | `pip install datacontract-cli[dataframe]` (PySpark not included — you supply the Spark session) |
439
+ | DBML | `pip install datacontract-cli[dbml]` |
440
+ | DuckDB (local file, CSV import and API response testing) | `pip install datacontract-cli[duckdb]` |
441
+ | Exasol | `pip install datacontract-cli[exasol]` |
442
+ | Excel | `pip install datacontract-cli[excel]` |
443
+ | GCS | `pip install datacontract-cli[gcs]` |
444
+ | SAP HANA / Datasphere | `pip install datacontract-cli[hana]` (not part of `all`: `hdbcli` is proprietary) |
445
+ | Apache Iceberg (schema import and export, REST catalog testing) | `pip install datacontract-cli[iceberg]` |
446
+ | Impala | `pip install datacontract-cli[impala]` |
447
+ | Kafka | `pip install datacontract-cli[kafka]` |
448
+ | MySQL | `pip install datacontract-cli[mysql]` |
449
+ | Oracle | `pip install datacontract-cli[oracle]` |
450
+ | Parquet | `pip install datacontract-cli[parquet]` |
451
+ | PostgreSQL | `pip install datacontract-cli[postgres]` |
452
+ | Protobuf | `pip install datacontract-cli[protobuf]` |
453
+ | RDF | `pip install datacontract-cli[rdf]` |
454
+ | Amazon Redshift | `pip install datacontract-cli[redshift]` |
455
+ | S3 | `pip install datacontract-cli[s3]` |
456
+ | Snowflake | `pip install datacontract-cli[snowflake]` |
457
+ | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
458
+ | Trino | `pip install datacontract-cli[trino]` |
451
459
 
452
460
 
453
461
  ## Documentation
@@ -256,7 +256,7 @@ Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signin
256
256
  ## Optional Dependencies (Extras)
257
257
 
258
258
  The CLI tool defines several optional dependencies (also known as extras) that can be installed for using with specific servers types.
259
- With _all_, all server dependencies are included.
259
+ With _all_, all server dependencies except `hana` are included.
260
260
 
261
261
  ```bash
262
262
  uv tool install --python python3.11 --upgrade 'datacontract-cli[all]'
@@ -264,35 +264,35 @@ uv tool install --python python3.11 --upgrade 'datacontract-cli[all]'
264
264
 
265
265
  A list of available extras:
266
266
 
267
- | Dependency | Installation Command |
268
- |------------------------------------------|--------------------------------------------|
269
- | Amazon Athena | `pip install datacontract-cli[athena]` |
270
- | Avro Support | `pip install datacontract-cli[avro]` |
271
- | Azure Integration | `pip install datacontract-cli[azure]` |
272
- | Google BigQuery | `pip install datacontract-cli[bigquery]` |
273
- | CSV | `pip install datacontract-cli[csv]` |
274
- | Databricks Integration | `pip install datacontract-cli[databricks]` |
275
- | Databricks Runtime | `pip install datacontract-cli[databricks]` (also inside Databricks, using the cluster's own Spark session) |
276
- | DataFrame (Spark) | `pip install datacontract-cli[dataframe]` (PySpark not included — you supply the Spark session) |
277
- | DBML | `pip install datacontract-cli[dbml]` |
278
- | DuckDB (local/S3/GCS/Azure file testing) | `pip install datacontract-cli[duckdb]` |
279
- | Excel | `pip install datacontract-cli[excel]` |
280
- | GCS Integration | `pip install datacontract-cli[gcs]` |
281
- | Iceberg | `pip install datacontract-cli[iceberg]` |
282
- | Impala | `pip install datacontract-cli[impala]` |
283
- | Kafka Integration | `pip install datacontract-cli[kafka]` |
284
- | MySQL Integration | `pip install datacontract-cli[mysql]` |
285
- | Oracle | `pip install datacontract-cli[oracle]` |
286
- | Parquet | `pip install datacontract-cli[parquet]` |
287
- | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
288
- | protobuf | `pip install datacontract-cli[protobuf]` |
289
- | RDF | `pip install datacontract-cli[rdf]` |
290
- | Amazon Redshift | `pip install datacontract-cli[redshift]` |
291
- | S3 Integration | `pip install datacontract-cli[s3]` |
292
- | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
293
- | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
294
- | Trino | `pip install datacontract-cli[trino]` |
295
- | API (run as web server) | `pip install datacontract-cli[api]` |
267
+ | Dependency | Installation command |
268
+ |---|---|
269
+ | API (run as web server) | `pip install datacontract-cli[api]` |
270
+ | Amazon Athena | `pip install datacontract-cli[athena]` |
271
+ | Avro | `pip install datacontract-cli[avro]` |
272
+ | Azure | `pip install datacontract-cli[azure]` |
273
+ | Google BigQuery | `pip install datacontract-cli[bigquery]` |
274
+ | Databricks | `pip install datacontract-cli[databricks]` (also inside a Databricks Runtime, using the cluster's own Spark session) |
275
+ | DataFrame (Spark) | `pip install datacontract-cli[dataframe]` (PySpark not included — you supply the Spark session) |
276
+ | DBML | `pip install datacontract-cli[dbml]` |
277
+ | DuckDB (local file, CSV import and API response testing) | `pip install datacontract-cli[duckdb]` |
278
+ | Exasol | `pip install datacontract-cli[exasol]` |
279
+ | Excel | `pip install datacontract-cli[excel]` |
280
+ | GCS | `pip install datacontract-cli[gcs]` |
281
+ | SAP HANA / Datasphere | `pip install datacontract-cli[hana]` (not part of `all`: `hdbcli` is proprietary) |
282
+ | Apache Iceberg (schema import and export, REST catalog testing) | `pip install datacontract-cli[iceberg]` |
283
+ | Impala | `pip install datacontract-cli[impala]` |
284
+ | Kafka | `pip install datacontract-cli[kafka]` |
285
+ | MySQL | `pip install datacontract-cli[mysql]` |
286
+ | Oracle | `pip install datacontract-cli[oracle]` |
287
+ | Parquet | `pip install datacontract-cli[parquet]` |
288
+ | PostgreSQL | `pip install datacontract-cli[postgres]` |
289
+ | Protobuf | `pip install datacontract-cli[protobuf]` |
290
+ | RDF | `pip install datacontract-cli[rdf]` |
291
+ | Amazon Redshift | `pip install datacontract-cli[redshift]` |
292
+ | S3 | `pip install datacontract-cli[s3]` |
293
+ | Snowflake | `pip install datacontract-cli[snowflake]` |
294
+ | Microsoft SQL Server | `pip install datacontract-cli[sqlserver]` |
295
+ | Trino | `pip install datacontract-cli[trino]` |
296
296
 
297
297
 
298
298
  ## Documentation
@@ -2,14 +2,12 @@ import json
2
2
  import logging
3
3
  import os
4
4
  import secrets
5
- import tempfile
6
5
  from importlib import metadata
7
6
  from typing import Annotated, Optional
8
7
 
9
8
  import pydantic
10
- import yaml
11
9
  from fastapi import Body, Depends, FastAPI, HTTPException, Query, Request, status
12
- from fastapi.responses import PlainTextResponse
10
+ from fastapi.responses import JSONResponse, PlainTextResponse
13
11
  from fastapi.security.api_key import APIKeyHeader
14
12
  from pydantic import BaseModel, Field, ValidationError
15
13
 
@@ -20,7 +18,9 @@ from datacontract.model.changelog import ChangelogEntry
20
18
  from datacontract.model.exceptions import DataContractException, DefinitionResolutionError
21
19
  from datacontract.model.run import Check, ResultEnum, Run
22
20
 
23
- DATA_CONTRACT_EXAMPLE_PAYLOAD = """apiVersion: v3.1.0
21
+ logger = logging.getLogger(__name__)
22
+
23
+ DATA_CONTRACT_EXAMPLE_PAYLOAD = """apiVersion: v3.2.0
24
24
  kind: DataContract
25
25
  id: orders
26
26
  name: Orders
@@ -335,6 +335,25 @@ app = FastAPI(
335
335
  ],
336
336
  )
337
337
 
338
+
339
+ @app.exception_handler(pydantic.ValidationError)
340
+ def _validation_error(request: Request, e: pydantic.ValidationError):
341
+ return JSONResponse(status_code=422, content={"detail": f"Invalid data contract: {e}"})
342
+
343
+
344
+ @app.exception_handler(DataContractException)
345
+ def _data_contract_exception(request: Request, e: DataContractException):
346
+ return JSONResponse(status_code=422, content={"detail": f"Data Contract Validation Failure: {e}"})
347
+
348
+
349
+ @app.exception_handler(DefinitionResolutionError)
350
+ def _definition_resolution_error(request: Request, e: DefinitionResolutionError):
351
+ # The reason names the host that was contacted and what it answered.
352
+ # Omit for security reasons.
353
+ logger.warning("Definition resolution failed: %s", e)
354
+ return JSONResponse(status_code=422, content={"detail": f"Could not resolve authoritative definition '{e.url}'."})
355
+
356
+
338
357
  _fastapi_openapi = app.openapi
339
358
 
340
359
 
@@ -481,6 +500,7 @@ _ENVIRONMENT_CREDENTIAL_TARGETS: dict[str, tuple[str, str | None, tuple[str, ...
481
500
  "oracle": ("host", "oracle_host", ("oracle_password",)),
482
501
  "impala": ("host", "impala_host", ("impala_password",)),
483
502
  "trino": ("host", "trino_host", ("trino_password",)),
503
+ "exasol": ("host", "exasol_host", ("exasol_password",)),
484
504
  "redshift": ("host", "redshift_host", ("redshift_password",)),
485
505
  "sqlserver": ("host", "sqlserver_host", ("sqlserver_password",)),
486
506
  "snowflake": (
@@ -665,21 +685,21 @@ def _reject_request_platform_host_with_environment_key(config) -> None:
665
685
  def check_api_key(api_key_header: str | None):
666
686
  correct_api_key = os.getenv("DATACONTRACT_CLI_API_KEY")
667
687
  if correct_api_key is None or correct_api_key == "":
668
- logging.info("Environment variable DATACONTRACT_CLI_API_KEY is not set. Skip API key check.")
688
+ logger.info("Environment variable DATACONTRACT_CLI_API_KEY is not set. Skip API key check.")
669
689
  return
670
690
  if api_key_header is None or api_key_header == "":
671
- logging.info("The API key is missing.")
691
+ logger.warning("The API key is missing.")
672
692
  raise HTTPException(
673
693
  status_code=status.HTTP_401_UNAUTHORIZED,
674
694
  detail="Missing API key. Use Header 'x-api-key' to provide the API key.",
675
695
  )
676
- if not secrets.compare_digest(api_key_header, correct_api_key):
677
- logging.info("The provided API key is not correct.")
696
+ if not secrets.compare_digest(api_key_header.encode(), correct_api_key.encode()):
697
+ logger.warning("The provided API key is not correct.")
678
698
  raise HTTPException(
679
699
  status_code=status.HTTP_403_FORBIDDEN,
680
700
  detail="The provided API key is not correct.",
681
701
  )
682
- logging.info("Request authenticated with API key.")
702
+ logger.info("Request authenticated with API key.")
683
703
  pass
684
704
 
685
705
 
@@ -777,8 +797,7 @@ async def test(
777
797
  status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
778
798
  detail="Use either the filter or the filters parameter, not both.",
779
799
  )
780
- logging.info("Testing data contract...")
781
- logging.info(body)
800
+ logger.info("Testing data contract...")
782
801
  config = config_from_headers(request.headers)
783
802
  untrusted_contract = getattr(request.app.state, "untrusted_contracts", False)
784
803
  if untrusted_contract:
@@ -857,7 +876,10 @@ async def lint(
857
876
  ) -> LintResponse:
858
877
  check_api_key(api_key)
859
878
  data_contract = DataContract(
860
- data_contract_str=body, schema_location=_require_schema_url(schema), all_errors=all_errors
879
+ data_contract_str=body,
880
+ schema_location=_require_schema_url(schema),
881
+ all_errors=all_errors,
882
+ untrusted_contract=True,
861
883
  )
862
884
  lint_result = data_contract.lint()
863
885
  return LintResponse(result=lint_result.result, checks=lint_result.checks)
@@ -933,30 +955,10 @@ async def changelog_endpoint(
933
955
  ) -> ChangelogResponse:
934
956
  check_api_key(api_key)
935
957
 
936
- with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f1:
937
- f1.write(body.v1)
938
- v1_path = f1.name
939
- with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f2:
940
- f2.write(body.v2)
941
- v2_path = f2.name
942
-
943
- try:
944
- result = DataContract(data_contract_file=v1_path).changelog(DataContract(data_contract_file=v2_path))
945
- return ChangelogResponse(summary=result.summary, entries=result.entries)
946
- except yaml.YAMLError as e:
947
- raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
948
- except pydantic.ValidationError as e:
949
- raise HTTPException(status_code=422, detail=f"Invalid data contract: {e}")
950
- except DefinitionResolutionError as e:
951
- # The reason names the host that was contacted and what it answered.
952
- # Omit for security reasons.
953
- logging.warning("Definition resolution failed: %s", e)
954
- raise HTTPException(status_code=422, detail=f"Could not resolve authoritative definition '{e.url}'.")
955
- except DataContractException as e:
956
- raise HTTPException(status_code=422, detail=f"Data Contract Validation Failure: {e}")
957
- finally:
958
- os.unlink(v1_path)
959
- os.unlink(v2_path)
958
+ result = DataContract(data_contract_str=body.v1, untrusted_contract=True).changelog(
959
+ DataContract(data_contract_str=body.v2, untrusted_contract=True)
960
+ )
961
+ return ChangelogResponse(summary=result.summary, entries=result.entries)
960
962
 
961
963
 
962
964
  @app.post(
@@ -986,25 +988,10 @@ def breaking_endpoint(
986
988
  ) -> BreakingChangesResponse:
987
989
  check_api_key(api_key)
988
990
 
989
- with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f1:
990
- f1.write(body.v1)
991
- v1_path = f1.name
992
- with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f2:
993
- f2.write(body.v2)
994
- v2_path = f2.name
995
-
996
- try:
997
- result = DataContract(data_contract_file=v1_path).breaking(DataContract(data_contract_file=v2_path))
998
- return BreakingChangesResponse(summary=result.summary, entries=result.entries, is_breaking=result.is_breaking)
999
- except yaml.YAMLError as e:
1000
- raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
1001
- except pydantic.ValidationError as e:
1002
- raise HTTPException(status_code=422, detail=f"Invalid data contract: {e}")
1003
- except DataContractException as e:
1004
- raise HTTPException(status_code=422, detail=f"Data Contract Validation Failure: {e}")
1005
- finally:
1006
- os.unlink(v1_path)
1007
- os.unlink(v2_path)
991
+ result = DataContract(data_contract_str=body.v1, untrusted_contract=True).breaking(
992
+ DataContract(data_contract_str=body.v2, untrusted_contract=True)
993
+ )
994
+ return BreakingChangesResponse(summary=result.summary, entries=result.entries, is_breaking=result.is_breaking)
1008
995
 
1009
996
 
1010
997
  @app.post(
@@ -1107,21 +1094,9 @@ def export(
1107
1094
  ] = None,
1108
1095
  ):
1109
1096
  check_api_key(api_key)
1110
- try:
1111
- return DataContract(data_contract_str=body, server=server).export(
1112
- export_format=format,
1113
- model=model,
1114
- rdf_base=rdf_base,
1115
- sql_server_type=sql_server_type,
1116
- )
1117
- except yaml.YAMLError as e:
1118
- raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
1119
- except pydantic.ValidationError as e:
1120
- raise HTTPException(status_code=422, detail=f"Invalid data contract: {e}")
1121
- except DefinitionResolutionError as e:
1122
- # The reason names the host that was contacted and what it answered.
1123
- # Omit for security reasons.
1124
- logging.warning("Definition resolution failed: %s", e)
1125
- raise HTTPException(status_code=422, detail=f"Could not resolve authoritative definition '{e.url}'.")
1126
- except DataContractException as e:
1127
- raise HTTPException(status_code=422, detail=f"Data Contract Validation Failure: {e}")
1097
+ return DataContract(data_contract_str=body, server=server, untrusted_contract=True).export(
1098
+ export_format=format,
1099
+ model=model,
1100
+ rdf_base=rdf_base,
1101
+ sql_server_type=sql_server_type,
1102
+ )
@@ -22,12 +22,41 @@ class BreakingChangeDetector:
22
22
 
23
23
  def detect(self, changelog: ChangelogResult) -> BreakingChangeResult:
24
24
  entries = [self._classify(entry) for entry in changelog.entries]
25
- # Nothing inside a newly added element can break a consumer: it did not exist before.
26
- added = {entry.path for entry in entries if entry.change_type == ChangelogType.added}
25
+ # Nothing inside an added element can break a consumer: it did not exist before.
26
+ # Inside a removed one, the element's own entry carries the grade; its former
27
+ # constraints are gone, which is a relaxation.
28
+ added_or_removed = {
29
+ entry.path
30
+ for entry in entries
31
+ if entry.change_type in (ChangelogType.added, ChangelogType.removed)
32
+ and (
33
+ entry.path.startswith("schema.")
34
+ and (len(entry.path.split(".")) == 2 or entry.path.split(".")[-2] in ("properties", "quality"))
35
+ )
36
+ }
37
+ removed_enums = {
38
+ entry.path
39
+ for entry in entries
40
+ if entry.change_type == ChangelogType.removed and entry.path.endswith(".enum")
41
+ }
42
+ # Stable IDs may change or swap without changing the set of allowed
43
+ # values. Match removed/updated values against additions in the same enum.
44
+ added_values = defaultdict(set)
45
+ for entry in entries:
46
+ if entry.rule_id == "enum-constraint-changed" and entry.path.endswith(".value"):
47
+ if entry.change_type in (ChangelogType.added, ChangelogType.updated):
48
+ added_values[entry.path.rsplit(".enum.", 1)[0]].add(entry.new_value)
27
49
  for entry in entries:
28
50
  segments = entry.path.split(".")
29
- if any(".".join(segments[:i]) in added for i in range(1, len(segments))):
51
+ if any(".".join(segments[:i]) in added_or_removed for i in range(1, len(segments))):
30
52
  entry.level = BreakingChangeLevel.INFO
53
+ if entry.rule_id == "enum-constraint-changed":
54
+ if any(entry.path.startswith(path + ".") for path in removed_enums):
55
+ entry.level = BreakingChangeLevel.INFO
56
+ elif entry.path.endswith(".value") and entry.old_value in added_values.get(
57
+ entry.path.rsplit(".enum.", 1)[0], set()
58
+ ):
59
+ entry.level = BreakingChangeLevel.INFO
31
60
  entries_by_prefix = defaultdict(list)
32
61
  for entry in entries:
33
62
  prefix = ""
@@ -140,6 +140,87 @@ class MetadataFallbackRule(BreakingChangeRule):
140
140
  return RuleEvaluation(self.rule_id, BreakingChangeLevel.INFO, _change_message("contract", entry))
141
141
 
142
142
 
143
+ class EnumConstraintRule(BreakingChangeRule):
144
+ rule_id = "enum-constraint-changed"
145
+
146
+ def evaluate(self, entry: ChangelogEntry) -> RuleEvaluation | None:
147
+ if not entry.path.startswith("schema.") or ".properties." not in entry.path:
148
+ return None
149
+ if entry.path.endswith(".enum"):
150
+ level = BreakingChangeLevel.ERROR if entry.type == ChangelogType.added else BreakingChangeLevel.INFO
151
+ elif (
152
+ ".enum." in entry.path
153
+ and entry.path.endswith(".value")
154
+ and ".customProperties." not in entry.path.rsplit(".enum.", 1)[1]
155
+ and ".authoritativeDefinitions." not in entry.path.rsplit(".enum.", 1)[1]
156
+ ):
157
+ level = BreakingChangeLevel.INFO if entry.type == ChangelogType.added else BreakingChangeLevel.ERROR
158
+ else:
159
+ return None
160
+ return RuleEvaluation(self.rule_id, level, _change_message("allowed values", entry))
161
+
162
+
163
+ class QualityConstraintRule(BreakingChangeRule):
164
+ rule_id = "quality-constraint-changed"
165
+ _thresholds = (
166
+ ".mustBeLessThan",
167
+ ".mustBeLessOrEqualTo",
168
+ ".mustBeGreaterThan",
169
+ ".mustBeGreaterOrEqualTo",
170
+ )
171
+
172
+ def evaluate(self, entry: ChangelogEntry) -> RuleEvaluation | None:
173
+ if not entry.path.startswith("schema.") or ".quality." not in entry.path:
174
+ return None
175
+ rule_path = entry.path.rsplit(".quality.", 1)[1]
176
+ if rule_path.endswith(".arguments.validValues"):
177
+ # The diff emits one entry per list element.
178
+ level = BreakingChangeLevel.INFO if entry.type == ChangelogType.added else BreakingChangeLevel.ERROR
179
+ elif rule_path.endswith(".arguments.invalidValues"):
180
+ level = BreakingChangeLevel.INFO if entry.type == ChangelogType.removed else BreakingChangeLevel.ERROR
181
+ elif rule_path.endswith(self._thresholds):
182
+ old = _parse_number(entry.old_value)
183
+ new = _parse_number(entry.new_value)
184
+ if entry.type == ChangelogType.removed:
185
+ level = BreakingChangeLevel.INFO
186
+ elif old is None or new is None:
187
+ level = BreakingChangeLevel.WARNING
188
+ elif _is_tightening(entry.path, old, new):
189
+ level = BreakingChangeLevel.ERROR
190
+ else:
191
+ level = BreakingChangeLevel.INFO
192
+ elif "." not in rule_path:
193
+ # A new rule is a constraint existing data may not satisfy; a removed one is a relaxation.
194
+ level = BreakingChangeLevel.ERROR if entry.type == ChangelogType.added else BreakingChangeLevel.INFO
195
+ elif rule_path.endswith((".description", ".dimension", ".businessImpact", ".severity")):
196
+ level = BreakingChangeLevel.INFO
197
+ elif ".customProperties." in rule_path or ".authoritativeDefinitions." in rule_path or ".tags" in rule_path:
198
+ level = BreakingChangeLevel.INFO
199
+ else:
200
+ # What the rule checks changed (type, metric, query, other arguments, thresholds we cannot order).
201
+ level = BreakingChangeLevel.WARNING
202
+ name, _, field = rule_path.partition(".")
203
+ subject = f"{field} of quality rule '{name}'" if field else "quality rule"
204
+ return RuleEvaluation(self.rule_id, level, _change_message(subject, entry))
205
+
206
+
207
+ class VectorShapeRule(BreakingChangeRule):
208
+ rule_id = "vector-shape-changed"
209
+
210
+ def evaluate(self, entry: ChangelogEntry) -> RuleEvaluation | None:
211
+ if not entry.path.startswith("schema.") or not entry.path.endswith(
212
+ (".logicalTypeOptions.dimensions", ".logicalTypeOptions.elementType")
213
+ ):
214
+ return None
215
+ if entry.path.endswith(".elementType"):
216
+ old = entry.old_value or "float32"
217
+ new = entry.new_value or "float32"
218
+ level = BreakingChangeLevel.INFO if old == new else BreakingChangeLevel.ERROR
219
+ else:
220
+ level = BreakingChangeLevel.WARNING if entry.type == ChangelogType.removed else BreakingChangeLevel.ERROR
221
+ return RuleEvaluation(self.rule_id, level, _change_message("vector shape", entry))
222
+
223
+
143
224
  def _is_schema_property_path(segments: list[str]) -> bool:
144
225
  return len(segments) >= 3 and segments[0] == "schema" and segments[-2] == "properties"
145
226
 
@@ -169,9 +250,9 @@ def _parse_number(value: str | None) -> float | None:
169
250
 
170
251
 
171
252
  def _is_tightening(path: str, old: float, new: float) -> bool:
172
- if path.endswith((".minLength", ".minimum", ".exclusiveMinimum")):
253
+ if path.endswith((".minLength", ".minimum", ".exclusiveMinimum", ".mustBeGreaterThan", ".mustBeGreaterOrEqualTo")):
173
254
  return new > old
174
- if path.endswith((".maxLength", ".maximum", ".exclusiveMaximum")):
255
+ if path.endswith((".maxLength", ".maximum", ".exclusiveMaximum", ".mustBeLessThan", ".mustBeLessOrEqualTo")):
175
256
  return new < old
176
257
  return True
177
258
 
@@ -185,6 +266,7 @@ def _change_message(subject: str, entry: ChangelogEntry) -> str:
185
266
 
186
267
 
187
268
  DEFAULT_RULES: tuple[BreakingChangeRule, ...] = (
269
+ QualityConstraintRule(),
188
270
  RequiredChangedRule(),
189
271
  SchemaRemovedRule(),
190
272
  FieldRemovedRule(),
@@ -192,5 +274,7 @@ DEFAULT_RULES: tuple[BreakingChangeRule, ...] = (
192
274
  UniqueConstraintRule(),
193
275
  KeyConstraintRule(),
194
276
  ValidationConstraintRule(),
277
+ EnumConstraintRule(),
278
+ VectorShapeRule(),
195
279
  MetadataFallbackRule(),
196
280
  )
@@ -12,6 +12,8 @@ from datacontract.config import cli_config
12
12
  from datacontract.data_contract import DataContract
13
13
  from datacontract.export.html_exporter import get_version
14
14
 
15
+ logger = logging.getLogger(__name__)
16
+
15
17
 
16
18
  def _get_owner(odcs: OpenDataContractStandard) -> Optional[str]:
17
19
  """Get the owner from ODCS customProperties or team."""
@@ -25,7 +27,7 @@ def _get_owner(odcs: OpenDataContractStandard) -> Optional[str]:
25
27
 
26
28
 
27
29
  def create_data_contract_html(contracts, file: Path, path: Path, schema: str):
28
- logging.debug(f"Creating data contract html for file {file} and schema {schema}")
30
+ logger.debug(f"Creating data contract html for file {file} and schema {schema}")
29
31
  data_contract = DataContract(
30
32
  data_contract_file=f"{file.absolute()}", inline_references=True, schema_location=schema, config=cli_config()
31
33
  )