datacontract-cli 1.2.4__tar.gz → 1.2.5__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 (480) hide show
  1. {datacontract_cli-1.2.4/datacontract_cli.egg-info → datacontract_cli-1.2.5}/PKG-INFO +2 -1
  2. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/README.md +1 -0
  3. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/api.py +5 -3
  4. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_edit.py +30 -2
  5. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/settings.py +9 -0
  6. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/data_contract.py +11 -2
  7. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/create_checks.py +9 -2
  8. datacontract_cli-1.2.5/datacontract/engines/ibis/connections/athena_patch.py +20 -0
  9. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/connect.py +11 -3
  10. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/duckdb_connection.py +44 -1
  11. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/native_type.py +1 -1
  12. datacontract_cli-1.2.5/datacontract/imports/postgres_importer.py +424 -0
  13. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/sql_importer.py +1 -1
  14. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/sqlserver_importer.py +4 -4
  15. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/dbt_sync.py +11 -19
  16. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/resolve.py +109 -44
  17. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5/datacontract_cli.egg-info}/PKG-INFO +2 -1
  18. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/SOURCES.txt +2 -0
  19. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/pyproject.toml +1 -1
  20. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_api.py +6 -3
  21. datacontract_cli-1.2.5/tests/test_api_concurrency.py +186 -0
  22. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config.py +5 -0
  23. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_athena.py +17 -2
  24. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_mysql.py +84 -0
  25. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_postgres.py +10 -0
  26. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_redshift.py +10 -0
  27. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_sqlserver.py +15 -0
  28. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dbt_sync.py +6 -6
  29. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_edit.py +36 -0
  30. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_markdown.py +1 -1
  31. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_spark.py +2 -2
  32. datacontract_cli-1.2.5/tests/test_import_postgres.py +396 -0
  33. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_postgres.py +6 -0
  34. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint.py +95 -10
  35. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_azure_remote.py +4 -3
  36. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_bigquery.py +5 -4
  37. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_checks_filter.py +3 -2
  38. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_databricks.py +3 -2
  39. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_delta.py +4 -3
  40. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_dimension_filter.py +2 -1
  41. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_dry_run.py +5 -4
  42. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_gcs_csv_remote.py +4 -3
  43. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_gcs_json_remote.py +4 -3
  44. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka_remote.py +3 -2
  45. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_json_nd.py +2 -1
  46. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_mysql.py +3 -2
  47. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_oracle.py +3 -2
  48. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_oracle_xe.py +3 -2
  49. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_parquet.py +8 -4
  50. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_postgres.py +5 -4
  51. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality.py +3 -2
  52. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_local_fallback.py +3 -2
  53. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_csv.py +4 -3
  54. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_delta.py +3 -2
  55. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json.py +3 -2
  56. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_complex.py +3 -2
  57. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_multiple_models.py +2 -1
  58. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_snowflake.py +3 -2
  59. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_sqlserver.py +3 -2
  60. datacontract_cli-1.2.5/tests/test_test_trino.py +187 -0
  61. datacontract_cli-1.2.4/datacontract/imports/postgres_importer.py +0 -259
  62. datacontract_cli-1.2.4/tests/test_import_postgres.py +0 -187
  63. datacontract_cli-1.2.4/tests/test_test_trino.py +0 -99
  64. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/LICENSE +0 -0
  65. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/MANIFEST.in +0 -0
  66. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/__init__.py +0 -0
  67. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/__init__.py +0 -0
  68. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/detector.py +0 -0
  69. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/rules.py +0 -0
  70. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/catalog/catalog.py +0 -0
  71. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/__init__.py +0 -0
  72. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/changelog.py +0 -0
  73. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/normalize.py +0 -0
  74. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/cli.py +0 -0
  75. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_api.py +0 -0
  76. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_breaking.py +0 -0
  77. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_catalog.py +0 -0
  78. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_changelog.py +0 -0
  79. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_ci.py +0 -0
  80. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_dbt.py +0 -0
  81. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_export.py +0 -0
  82. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_import.py +0 -0
  83. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_init.py +0 -0
  84. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_lint.py +0 -0
  85. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_publish.py +0 -0
  86. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_test.py +0 -0
  87. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/__init__.py +0 -0
  88. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/cli_context.py +0 -0
  89. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/variables.py +0 -0
  90. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/VERSION +0 -0
  91. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
  92. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
  93. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/datacontract-editor.css +0 -0
  94. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
  95. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/index.html +0 -0
  96. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  97. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
  98. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/odcs.svg +0 -0
  99. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/robots.txt +0 -0
  100. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/rolldown-runtime-DY7j01NX.js +0 -0
  101. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/sitemap.xml +0 -0
  102. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/__init__.py +0 -0
  103. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/__init__.py +0 -0
  104. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/check_filter.py +0 -0
  105. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/check_spec.py +0 -0
  106. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/custom_quality_check.py +0 -0
  107. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/dimensions.py +0 -0
  108. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/physical_type_match.py +0 -0
  109. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/severity.py +0 -0
  110. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/sql_guard.py +0 -0
  111. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/type_normalize.py +0 -0
  112. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/data_contract_test.py +0 -0
  113. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_azure_blob_file.py +0 -0
  114. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  115. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  116. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  117. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  118. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/__init__.py +0 -0
  119. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/check_hana_execute.py +0 -0
  120. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_check_selection.py +0 -0
  121. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_connection.py +0 -0
  122. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_quality_check.py +0 -0
  123. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_schema_check.py +0 -0
  124. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_type_mapping.py +0 -0
  125. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/__init__.py +0 -0
  126. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/__init__.py +0 -0
  127. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/aws_credentials.py +0 -0
  128. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/databricks_patch.py +0 -0
  129. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/exasol_patch.py +0 -0
  130. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/hive_patch.py +0 -0
  131. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/iceberg.py +0 -0
  132. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/kafka.py +0 -0
  133. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
  134. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/redshift_credentials.py +0 -0
  135. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
  136. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/dtype_category.py +0 -0
  137. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/ibis_check_execute.py +0 -0
  138. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/snowflake_structured_types.py +0 -0
  139. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/__init__.py +0 -0
  140. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/avro_exporter.py +0 -0
  141. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/avro_idl_exporter.py +0 -0
  142. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/bigquery_exporter.py +0 -0
  143. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/custom_exporter.py +0 -0
  144. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/data_caterer_exporter.py +0 -0
  145. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dbml_exporter.py +0 -0
  146. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dbt_exporter.py +0 -0
  147. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dcs_exporter.py +0 -0
  148. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dqx_exporter.py +0 -0
  149. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/duckdb_type_converter.py +0 -0
  150. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/excel_exporter.py +0 -0
  151. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/exporter.py +0 -0
  152. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/exporter_factory.py +0 -0
  153. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/go_exporter.py +0 -0
  154. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/great_expectations_exporter.py +0 -0
  155. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/html_exporter.py +0 -0
  156. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/iceberg_exporter.py +0 -0
  157. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/jsonschema_exporter.py +0 -0
  158. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/markdown_exporter.py +0 -0
  159. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/mermaid_exporter.py +0 -0
  160. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/odcs_v3_exporter.py +0 -0
  161. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/pandas_type_converter.py +0 -0
  162. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/protobuf_exporter.py +0 -0
  163. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/pydantic_exporter.py +0 -0
  164. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/rdf_exporter.py +0 -0
  165. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sodacl_check_builder.py +0 -0
  166. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sodacl_exporter.py +0 -0
  167. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/spark_exporter.py +0 -0
  168. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sql_exporter.py +0 -0
  169. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sql_type_converter.py +0 -0
  170. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sqlalchemy_exporter.py +0 -0
  171. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/xsd_exporter.py +0 -0
  172. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/athena_importer.py +0 -0
  173. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/avro_importer.py +0 -0
  174. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/bigquery_importer.py +0 -0
  175. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/clickhouse_importer.py +0 -0
  176. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/csv_importer.py +0 -0
  177. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dbml_importer.py +0 -0
  178. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dbt_importer.py +0 -0
  179. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dcs_importer.py +0 -0
  180. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/excel_importer.py +0 -0
  181. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/glue_importer.py +0 -0
  182. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/hive_importer.py +0 -0
  183. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/iceberg_importer.py +0 -0
  184. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/importer.py +0 -0
  185. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/importer_factory.py +0 -0
  186. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/json_importer.py +0 -0
  187. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/jsonschema_importer.py +0 -0
  188. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/mysql_importer.py +0 -0
  189. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/object_storage_importer.py +0 -0
  190. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odata_importer.py +0 -0
  191. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odcs_helper.py +0 -0
  192. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odcs_importer.py +0 -0
  193. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/openapi_importer.py +0 -0
  194. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/oracle_importer.py +0 -0
  195. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/parquet_importer.py +0 -0
  196. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/powerbi_importer.py +0 -0
  197. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/protobuf_importer.py +0 -0
  198. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/pydantic_importer.py +0 -0
  199. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/redshift_importer.py +0 -0
  200. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/snowflake_importer.py +0 -0
  201. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/spark_importer.py +0 -0
  202. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/spark_type_json.py +0 -0
  203. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/trino_importer.py +0 -0
  204. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/unity_importer.py +0 -0
  205. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/xsd_importer.py +0 -0
  206. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/init/init_template.py +0 -0
  207. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/dbt_test_mapping.py +0 -0
  208. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/entropy_data.py +0 -0
  209. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/constraints.py +0 -0
  210. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/files.py +0 -0
  211. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/resources.py +0 -0
  212. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/s3.py +0 -0
  213. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/schema.py +0 -0
  214. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/urls.py +0 -0
  215. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/breaking.py +0 -0
  216. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/changelog.py +0 -0
  217. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/enum_values.py +0 -0
  218. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/exceptions.py +0 -0
  219. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/map_type.py +0 -0
  220. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/natural_keys.py +0 -0
  221. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/odcs.py +0 -0
  222. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/run.py +0 -0
  223. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/server.py +0 -0
  224. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/vector_type.py +0 -0
  225. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/workbook.py +0 -0
  226. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/__init__.py +0 -0
  227. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/ci_output.py +0 -0
  228. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/json_test_results.py +0 -0
  229. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/junit_test_results.py +0 -0
  230. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/output_format.py +0 -0
  231. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/test_results_writer.py +0 -0
  232. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/text_breaking_results.py +0 -0
  233. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/text_changelog_results.py +0 -0
  234. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/py.typed +0 -0
  235. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  236. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  237. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  238. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  239. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  240. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  241. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  242. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  243. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.2.0.init.yaml +0 -0
  244. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.2.0.schema.json +0 -0
  245. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/datacontract.html +0 -0
  246. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/datacontract_odcs.html +0 -0
  247. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.0.xlsx +0 -0
  248. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.1.xlsx +0 -0
  249. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.2.xlsx +0 -0
  250. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/index.html +0 -0
  251. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/authoritative_definitions.html +0 -0
  252. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/context.html +0 -0
  253. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/schema.html +0 -0
  254. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/server.html +0 -0
  255. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/support.html +0 -0
  256. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_information.html +0 -0
  257. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  258. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_terms.html +0 -0
  259. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/definition.html +0 -0
  260. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/example.html +0 -0
  261. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/model_field.html +0 -0
  262. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/quality.html +0 -0
  263. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/server.html +0 -0
  264. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/context.html +0 -0
  265. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/custom_properties.html +0 -0
  266. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/diagram.html +0 -0
  267. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/dialog_yaml.html +0 -0
  268. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/footer.html +0 -0
  269. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/fundamentals.html +0 -0
  270. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/header.html +0 -0
  271. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/pricing.html +0 -0
  272. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/roles.html +0 -0
  273. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/schema.html +0 -0
  274. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/servers.html +0 -0
  275. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/sla.html +0 -0
  276. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/support.html +0 -0
  277. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/team.html +0 -0
  278. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/term_of_use.html +0 -0
  279. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/title.html +0 -0
  280. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/style/output.css +0 -0
  281. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  282. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/entry_points.txt +0 -0
  283. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/requires.txt +0 -0
  284. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/top_level.txt +0 -0
  285. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/setup.cfg +0 -0
  286. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_api_openapi.py +0 -0
  287. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_breaking.py +0 -0
  288. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_breaking_odcs_3_2.py +0 -0
  289. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_catalog.py +0 -0
  290. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog.py +0 -0
  291. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_engine.py +0 -0
  292. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_normalize.py +0 -0
  293. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_output_text.py +0 -0
  294. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_check_quality_provenance.py +0 -0
  295. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ci_output.py +0 -0
  296. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_cli.py +0 -0
  297. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_command_api.py +0 -0
  298. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_command_api_options.py +0 -0
  299. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_file.py +0 -0
  300. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_require.py +0 -0
  301. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_threading.py +0 -0
  302. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_bigquery.py +0 -0
  303. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_clickhouse.py +0 -0
  304. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_databricks.py +0 -0
  305. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_exasol.py +0 -0
  306. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_hive.py +0 -0
  307. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_impala.py +0 -0
  308. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_oracle.py +0 -0
  309. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_s3_credentials.py +0 -0
  310. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_snowflake.py +0 -0
  311. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_trino.py +0 -0
  312. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_array_items.py +0 -0
  313. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_nested.py +0 -0
  314. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_nested_type.py +0 -0
  315. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_physical_type.py +0 -0
  316. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_primary_key.py +0 -0
  317. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_retention_period.py +0 -0
  318. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_servicelevel.py +0 -0
  319. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_sql_placeholders.py +0 -0
  320. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_custom_quality_checks.py +0 -0
  321. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract.py +0 -0
  322. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract_checks.py +0 -0
  323. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract_specification.py +0 -0
  324. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dbt_test_mapping.py +0 -0
  325. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_description_linter.py +0 -0
  326. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_commands.py +0 -0
  327. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_config_options.py +0 -0
  328. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_ordering.py +0 -0
  329. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_download_datacontract_file.py +0 -0
  330. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dtype_category.py +0 -0
  331. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_duckdb_json.py +0 -0
  332. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_enum_values.py +0 -0
  333. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_avro.py +0 -0
  334. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_avro_idl.py +0 -0
  335. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_bigquery.py +0 -0
  336. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_complex_data_contract.py +0 -0
  337. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom.py +0 -0
  338. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom_exporter.py +0 -0
  339. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom_model.py +0 -0
  340. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_data_caterer.py +0 -0
  341. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbml.py +0 -0
  342. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_models.py +0 -0
  343. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_sources.py +0 -0
  344. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_staging_sql.py +0 -0
  345. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dcs.py +0 -0
  346. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dqx.py +0 -0
  347. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_excel.py +0 -0
  348. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_go.py +0 -0
  349. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_great_expectations.py +0 -0
  350. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_html.py +0 -0
  351. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_iceberg.py +0 -0
  352. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_jsonschema.py +0 -0
  353. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_large_contract.py +0 -0
  354. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_mermaid.py +0 -0
  355. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_odcs_v3.py +0 -0
  356. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_protobuf.py +0 -0
  357. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_pydantic.py +0 -0
  358. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_rdf.py +0 -0
  359. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sodacl.py +0 -0
  360. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql.py +0 -0
  361. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql_clickhouse.py +0 -0
  362. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql_query.py +0 -0
  363. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sqlalchemy.py +0 -0
  364. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_xsd.py +0 -0
  365. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_connection.py +0 -0
  366. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_quality_check.py +0 -0
  367. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_schema_check.py +0 -0
  368. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_type_mapping.py +0 -0
  369. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_check_execute.py +0 -0
  370. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_mssql_pattern.py +0 -0
  371. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_mssql_schema.py +0 -0
  372. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_oracle_schema.py +0 -0
  373. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_athena.py +0 -0
  374. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_avro.py +0 -0
  375. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_bigquery.py +0 -0
  376. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_clickhouse.py +0 -0
  377. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_csv.py +0 -0
  378. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_dbml.py +0 -0
  379. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_dbt.py +0 -0
  380. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_excel.py +0 -0
  381. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_glue.py +0 -0
  382. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_hive.py +0 -0
  383. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_iceberg.py +0 -0
  384. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_json.py +0 -0
  385. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_jsonschema.py +0 -0
  386. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_mysql.py +0 -0
  387. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_object_storage.py +0 -0
  388. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_odata.py +0 -0
  389. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_odcs_v3.py +0 -0
  390. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_openapi.py +0 -0
  391. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_oracle.py +0 -0
  392. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_parquet.py +0 -0
  393. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_powerbi.py +0 -0
  394. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_protobuf.py +0 -0
  395. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_pydantic_model.py +0 -0
  396. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_redshift.py +0 -0
  397. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_snowflake.py +0 -0
  398. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_spark_type_json.py +0 -0
  399. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_clickhouse.py +0 -0
  400. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_hive.py +0 -0
  401. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_oracle.py +0 -0
  402. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_snowflake.py +0 -0
  403. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_sqlserver.py +0 -0
  404. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_struct.py +0 -0
  405. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sqlserver.py +0 -0
  406. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_trino.py +0 -0
  407. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_unity_file.py +0 -0
  408. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_unmapped_types.py +0 -0
  409. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_xsd.py +0 -0
  410. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_install_extras.py +0 -0
  411. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_integration_entropydata.py +0 -0
  412. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_files.py +0 -0
  413. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_odcs_3_2_constraints.py +0 -0
  414. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_schema.py +0 -0
  415. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_urls.py +0 -0
  416. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_map_type.py +0 -0
  417. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_metadata_fields.py +0 -0
  418. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_native_type_schema_scope.py +0 -0
  419. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_nested_path_checks.py +0 -0
  420. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_oracle_patch.py +0 -0
  421. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_physical_type_match.py +0 -0
  422. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_publish_test_results.py +0 -0
  423. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_publish_test_results_payload.py +0 -0
  424. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_quality_sql_dialects.py +0 -0
  425. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_quality_unrunnable_rules.py +0 -0
  426. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_redshift_credentials.py +0 -0
  427. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_redshift_patch.py +0 -0
  428. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve.py +0 -0
  429. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve_definitions.py +0 -0
  430. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve_local_definitions.py +0 -0
  431. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_jsonschema.py +0 -0
  432. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_pydantic_model.py +0 -0
  433. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_xsd.py +0 -0
  434. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_row_filter_duplicate_count.py +0 -0
  435. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_run_check_deprecated_fields.py +0 -0
  436. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_run_check_engine.py +0 -0
  437. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_overrides.py +0 -0
  438. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_type_mssql.py +0 -0
  439. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_type_synonyms.py +0 -0
  440. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_servers_3_2_0.py +0 -0
  441. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_snowflake_structured_types.py +0 -0
  442. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_sql_type_converter_physicaltype.py +0 -0
  443. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_api.py +0 -0
  444. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_api_openapi_import.py +0 -0
  445. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_array_items.py +0 -0
  446. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_athena_iceberg.py +0 -0
  447. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_azure_blob_file.py +0 -0
  448. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_clickhouse.py +0 -0
  449. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_diagnostics.py +0 -0
  450. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_duckdb.py +0 -0
  451. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_failed_samples.py +0 -0
  452. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_hana.py +0 -0
  453. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_hive.py +0 -0
  454. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg.py +0 -0
  455. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg_rest.py +0 -0
  456. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg_s3tables.py +0 -0
  457. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka.py +0 -0
  458. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka_decoding.py +0 -0
  459. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_json.py +0 -0
  460. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_xml.py +0 -0
  461. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_metadata_only.py +0 -0
  462. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_nested_checks.py +0 -0
  463. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_output_json.py +0 -0
  464. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_output_junit.py +0 -0
  465. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_id_and_tag_filter.py +0 -0
  466. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_percent_severity.py +0 -0
  467. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_redshift.py +0 -0
  468. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_relationships.py +0 -0
  469. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_results_writer.py +0 -0
  470. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_row_filter.py +0 -0
  471. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_multiple_files.py +0 -0
  472. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_schema_evolution.py +0 -0
  473. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_server_not_found.py +0 -0
  474. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_soda_connection_error.py +0 -0
  475. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_variables.py +0 -0
  476. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_type_normalize.py +0 -0
  477. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_untrusted_contract.py +0 -0
  478. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_untrusted_contract_variables.py +0 -0
  479. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_variables.py +0 -0
  480. {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_vector_type.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.2.4
3
+ Version: 1.2.5
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
@@ -183,6 +183,7 @@ Dynamic: license-file
183
183
  <a href="https://datacontract.com/slack" rel="nofollow"><img src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&amp;style=social" alt="Slack Status" data-canonical-src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&amp;style=social" style="max-width: 100%;"></a>
184
184
  </p>
185
185
 
186
+ **Turn your schemas into data contracts and test your data against them, on Snowflake, Databricks, BigQuery, Kafka, Postgres & 15 more. Open source, built on the Open Data Contract Standard.**
186
187
  The `datacontract` CLI is an open-source command-line tool for working with [data contracts](https://datacontract.com).
187
188
  It natively supports the [Open Data Contract Standard](https://bitol-io.github.io/open-data-contract-standard/latest/) to lint data contracts, connect to data sources and execute schema and quality tests, and export to different formats.
188
189
  The tool is written in Python.
@@ -12,6 +12,7 @@
12
12
  <a href="https://datacontract.com/slack" rel="nofollow"><img src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&amp;style=social" alt="Slack Status" data-canonical-src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&amp;style=social" style="max-width: 100%;"></a>
13
13
  </p>
14
14
 
15
+ **Turn your schemas into data contracts and test your data against them, on Snowflake, Databricks, BigQuery, Kafka, Postgres & 15 more. Open source, built on the Open Data Contract Standard.**
15
16
  The `datacontract` CLI is an open-source command-line tool for working with [data contracts](https://datacontract.com).
16
17
  It natively supports the [Open Data Contract Standard](https://bitol-io.github.io/open-data-contract-standard/latest/) to lint data contracts, connect to data sources and execute schema and quality tests, and export to different formats.
17
18
  The tool is written in Python.
@@ -275,6 +275,8 @@ tenants. Send them over HTTPS only.
275
275
  See [Configuration](https://docs.datacontract.com/configuration) for the full list of options.
276
276
  """
277
277
 
278
+ # The endpoints are plain `def`, not `async def`: they block on data sources, and FastAPI runs
279
+ # plain functions in a thread pool, so one slow test does not stall every other request.
278
280
  app = FastAPI(
279
281
  docs_url="/",
280
282
  title="Data Contract CLI API",
@@ -763,7 +765,7 @@ handled. A contract that cannot be parsed is reported the same way, as a failed
763
765
  response_model_exclude_none=True,
764
766
  response_model_exclude_unset=True,
765
767
  )
766
- async def test(
768
+ def test(
767
769
  request: Request,
768
770
  body: Annotated[
769
771
  str,
@@ -870,7 +872,7 @@ violation — not as an error status. A `schema` that is not an `http(s)` URL is
870
872
  },
871
873
  },
872
874
  )
873
- async def lint(
875
+ def lint(
874
876
  body: Annotated[
875
877
  str,
876
878
  Body(
@@ -968,7 +970,7 @@ parsed is answered with `422`.
968
970
  },
969
971
  },
970
972
  )
971
- async def changelog_endpoint(
973
+ def changelog_endpoint(
972
974
  body: ChangelogRequest,
973
975
  api_key: Annotated[str | None, Depends(api_key_header)] = None,
974
976
  ) -> ChangelogResponse:
@@ -74,7 +74,29 @@ def _cli_version() -> str:
74
74
  return "unknown"
75
75
 
76
76
 
77
- def _generate_index_html(filename: str) -> str:
77
+ # The editor's AI assistant is configured via these environment variables (e.g., in .env).
78
+ # It is enabled when DATACONTRACT_EDITOR_AI_ENDPOINT is set.
79
+ EDITOR_AI_ENV_VARS = {
80
+ "provider": "DATACONTRACT_EDITOR_AI_PROVIDER",
81
+ "endpoint": "DATACONTRACT_EDITOR_AI_ENDPOINT",
82
+ "apiKey": "DATACONTRACT_EDITOR_AI_API_KEY",
83
+ "model": "DATACONTRACT_EDITOR_AI_MODEL",
84
+ "authHeader": "DATACONTRACT_EDITOR_AI_AUTH_HEADER",
85
+ }
86
+
87
+
88
+ def editor_ai_config() -> dict | None:
89
+ """Return the editor's AI assistant config from the environment, or None if no endpoint is set."""
90
+ if not os.getenv(EDITOR_AI_ENV_VARS["endpoint"]):
91
+ return None
92
+ ai = {"enabled": True}
93
+ for key, env_var in EDITOR_AI_ENV_VARS.items():
94
+ if os.getenv(env_var):
95
+ ai[key] = os.getenv(env_var)
96
+ return ai
97
+
98
+
99
+ def _generate_index_html(filename: str, ai_config: dict | None = None) -> str:
78
100
  """
79
101
  Generate the editor page: load the YAML from the local file API, write it back on
80
102
  save, and point the editor's test runner at this server's own /test endpoint.
@@ -82,8 +104,10 @@ def _generate_index_html(filename: str) -> str:
82
104
  The editor runs in EMBEDDED mode, since the file menu (New, Load Example, Open)
83
105
  makes no sense when the editor is bound to a single local file. The filename is
84
106
  shown in the header via titlePrefix, and Cancel reverts to the file on disk.
107
+ The AI assistant is configured if ai_config is given.
85
108
  """
86
109
  filename_js = json.dumps(filename)
110
+ ai_option = f"ai: {json.dumps(ai_config)}," if ai_config else ""
87
111
  file_api_path = f"/api/files/{quote(filename)}"
88
112
  return f"""<!doctype html>
89
113
  <html lang="en">
@@ -136,6 +160,7 @@ def _generate_index_html(filename: str) -> str:
136
160
  enabled: true,
137
161
  dataContractCliApiServerUrl: window.location.origin,
138
162
  }},
163
+ {ai_option}
139
164
  onCancel: async () => {{
140
165
  try {{
141
166
  const response = await fetch('{file_api_path}');
@@ -213,7 +238,7 @@ def create_app(
213
238
 
214
239
  @edit_app.get("/", response_class=HTMLResponse, include_in_schema=False)
215
240
  def index():
216
- return _generate_index_html(filename)
241
+ return _generate_index_html(filename, editor_ai_config())
217
242
 
218
243
  @edit_app.get(EDITOR_ASSETS_PATH + "/{asset_path:path}", include_in_schema=False)
219
244
  def editor_asset(asset_path: str):
@@ -337,6 +362,9 @@ def edit(
337
362
  the data contract tests locally against the servers defined in the data contract.
338
363
  Credentials for the data sources must be provided as environment variables, see
339
364
  https://docs.datacontract.com/testing
365
+ The editor's AI assistant is enabled by setting DATACONTRACT_EDITOR_AI_ENDPOINT, together with
366
+ DATACONTRACT_EDITOR_AI_API_KEY, DATACONTRACT_EDITOR_AI_MODEL, DATACONTRACT_EDITOR_AI_PROVIDER
367
+ (openai or anthropic), and DATACONTRACT_EDITOR_AI_AUTH_HEADER (bearer, api-key, or x-api-key).
340
368
  """
341
369
  enable_debug_logging(debug)
342
370
 
@@ -13,6 +13,9 @@ logger = logging.getLogger(__name__)
13
13
 
14
14
  _ENV_PREFIX = "DATACONTRACT_"
15
15
 
16
+ # Used by the drivers that would otherwise wait forever for an unresponsive data source.
17
+ DEFAULT_CONNECT_TIMEOUT = 30
18
+
16
19
  # Deprecated option (field name) -> replacement (field name). Single source for
17
20
  # the accessor warnings, the Snowflake connect synonyms, and the generated docs.
18
21
  DEPRECATED_OPTIONS = {
@@ -112,6 +115,7 @@ class Config(BaseSettings):
112
115
  api_header_authorization: SecretStr | None = None
113
116
  custom_quality_checks: str | None = None
114
117
  max_errors: int | None = None
118
+ connect_timeout: int | None = None
115
119
 
116
120
  # athena (credentials come from the s3_* options)
117
121
  # overrides for the contract's servers block
@@ -530,6 +534,11 @@ class Config(BaseSettings):
530
534
  def get_max_errors(self) -> int | None:
531
535
  return self._int_option("max_errors")
532
536
 
537
+ # --- connect timeout ---
538
+ def get_connect_timeout(self) -> int:
539
+ """Seconds to wait for a data source to accept a connection, for drivers that wait forever by default."""
540
+ return self._int_option("connect_timeout") or DEFAULT_CONNECT_TIMEOUT
541
+
533
542
  # --- athena ---
534
543
  def get_athena_catalog(self, required: bool = False) -> str | None:
535
544
  return self._str_option("athena_catalog", required)
@@ -32,6 +32,13 @@ from datacontract.model.run import Check, ResultEnum, Run
32
32
  logger = logging.getLogger(__name__)
33
33
 
34
34
 
35
+ def _warning_checks(warnings: list[DataContractException]) -> list[Check]:
36
+ return [
37
+ Check(type=warning.type, result=warning.result, name=warning.name, reason=warning.reason, engine=warning.engine)
38
+ for warning in warnings
39
+ ]
40
+
41
+
35
42
  def _unrunnable_rule_checks(data_contract: OpenDataContractStandard) -> list[Check]:
36
43
  """Warnings for quality rules `datacontract test` would not be able to run."""
37
44
  checks = []
@@ -150,7 +157,7 @@ class DataContract:
150
157
  run = Run.create_run()
151
158
  try:
152
159
  run.log_info("Linting data contract")
153
- data_contract, schema_version = resolve.resolve_data_contract_with_schema_version(
160
+ data_contract, schema_version, warnings = resolve.resolve_data_contract_with_lint_info(
154
161
  self._data_contract_file,
155
162
  self._data_contract_str,
156
163
  self._data_contract,
@@ -171,6 +178,7 @@ class DataContract:
171
178
  engine="datacontract-cli",
172
179
  )
173
180
  )
181
+ run.checks.extend(_warning_checks(warnings))
174
182
  run.checks.extend(_unrunnable_rule_checks(data_contract))
175
183
  run.dataContractId = data_contract.id
176
184
  run.dataContractVersion = data_contract.version
@@ -221,7 +229,7 @@ class DataContract:
221
229
  try:
222
230
  run.log_info("Testing data contract")
223
231
  run.log_info(self._runtime_info())
224
- data_contract = resolve.resolve_data_contract(
232
+ data_contract, _, warnings = resolve.resolve_data_contract_with_lint_info(
225
233
  self._data_contract_file,
226
234
  self._data_contract_str,
227
235
  self._data_contract,
@@ -230,6 +238,7 @@ class DataContract:
230
238
  config=self._config,
231
239
  configured_host_only=self._untrusted_contract,
232
240
  )
241
+ run.checks.extend(_warning_checks(warnings))
233
242
 
234
243
  execute_data_contract_test(
235
244
  data_contract,
@@ -43,8 +43,15 @@ from datacontract.model.server import get_server_type
43
43
  logger = logging.getLogger(__name__)
44
44
 
45
45
  _FILE_SERVER_TYPES = {"local", "s3", "gcs", "azure"}
46
- # Spark and every server read through DuckDB
47
- _NESTED_CHECK_SERVER_TYPES = {"dataframe", "databricks", "duckdb", "iceberg", "kafka"} | _FILE_SERVER_TYPES
46
+ _NESTED_CHECK_SERVER_TYPES = {
47
+ "dataframe",
48
+ "databricks",
49
+ "duckdb",
50
+ "iceberg",
51
+ "kafka",
52
+ "trino",
53
+ "athena",
54
+ } | _FILE_SERVER_TYPES
48
55
 
49
56
 
50
57
  # ---------------------------------------------------------------------------
@@ -0,0 +1,20 @@
1
+ """ibis lists ``ArrayFilter`` and ``ArrayMap`` as unsupported on Athena, although Athena engine
2
+ version 3 runs the ``filter()`` / ``transform()`` its Trino compiler emits; checks on array items need them."""
3
+
4
+ from __future__ import annotations
5
+
6
+
7
+ def apply_athena_compatibility_patch(con) -> None:
8
+ import ibis.expr.operations as ops
9
+ from ibis.backends.sql.compilers.athena import AthenaCompiler
10
+ from ibis.backends.sql.compilers.trino import TrinoCompiler
11
+
12
+ lambdas = (ops.ArrayFilter, ops.ArrayMap)
13
+
14
+ class ArrayLambdaAthenaCompiler(AthenaCompiler):
15
+ # ibis replaces the visit method of every op still listed here
16
+ UNSUPPORTED_OPS = tuple(op for op in AthenaCompiler.UNSUPPORTED_OPS if op not in lambdas)
17
+ visit_ArrayFilter = TrinoCompiler.visit_ArrayFilter
18
+ visit_ArrayMap = TrinoCompiler.visit_ArrayMap
19
+
20
+ con.compiler = ArrayLambdaAthenaCompiler()
@@ -125,6 +125,8 @@ def connect_ibis(
125
125
  password=config.get_postgres_password(required=True),
126
126
  database=config.get_postgres_database() or server.database,
127
127
  schema=config.get_postgres_schema() or server.schema_,
128
+ # libpq waits forever for a server that accepts the connection but never answers
129
+ connect_timeout=config.get_connect_timeout(),
128
130
  )
129
131
 
130
132
  if server_type == "redshift":
@@ -141,6 +143,7 @@ def connect_ibis(
141
143
  database=database,
142
144
  schema=config.get_redshift_schema() or server.schema_,
143
145
  client_encoding=CLIENT_ENCODING,
146
+ connect_timeout=config.get_connect_timeout(),
144
147
  )
145
148
  if login.password:
146
149
  kwargs["password"] = login.password
@@ -617,7 +620,7 @@ def _connect_mysql_via_duckdb(
617
620
  _load_extension(con, "mysql", "mysql")
618
621
 
619
622
  run.log_info(f"Attaching MySQL {host}:{port} via the duckdb mysql extension")
620
- _attach_mysql(con, host, port, user, password, database)
623
+ _attach_mysql(con, host, port, user, password, database, config.get_connect_timeout())
621
624
 
622
625
  if data_contract.schema_:
623
626
  for schema_obj in data_contract.schema_:
@@ -677,7 +680,8 @@ def _connect_sqlserver(ibis, server: Server, config: Config):
677
680
  del kwargs[key] # pyodbc would send a literal DATABASE=None
678
681
  else:
679
682
  kwargs[key] = "{" + kwargs[key].replace("}", "}}") + "}"
680
- con = pyodbc.connect(**kwargs)
683
+ # the login timeout, so an unreachable server fails instead of blocking the run
684
+ con = pyodbc.connect(timeout=config.get_connect_timeout(), **kwargs)
681
685
  return ibis.mssql.from_connection(con)
682
686
 
683
687
 
@@ -803,6 +807,8 @@ def _azure_cli_access_token() -> bytes:
803
807
 
804
808
 
805
809
  def _connect_athena(ibis, server: Server, config: Config):
810
+ from datacontract.engines.ibis.connections.athena_patch import apply_athena_compatibility_patch
811
+
806
812
  # regionName is a contract value, so the variable still wins over it
807
813
  credentials = aws_credentials.client_kwargs(aws_credentials.configured_region(server.regionName, config), config)
808
814
  schema = config.get_athena_schema() or server.schema_
@@ -839,7 +845,9 @@ def _connect_athena(ibis, server: Server, config: Config):
839
845
  # Optional data source / catalog; pyathena defaults it to `awsdatacatalog`.
840
846
  if catalog:
841
847
  kwargs["catalog_name"] = catalog
842
- return ibis.athena.connect(**kwargs)
848
+ con = ibis.athena.connect(**kwargs)
849
+ apply_athena_compatibility_patch(con)
850
+ return con
843
851
 
844
852
 
845
853
  def _connect_trino(ibis, server: Server, config: Config):
@@ -1,10 +1,12 @@
1
1
  import logging
2
2
  import re
3
+ import socket
3
4
  from typing import TYPE_CHECKING, Any, List, Optional
4
5
 
5
6
  from open_data_contract_standard.model import OpenDataContractStandard, SchemaObject, SchemaProperty, Server
6
7
 
7
8
  from datacontract.config import Config
9
+ from datacontract.config.settings import DEFAULT_CONNECT_TIMEOUT
8
10
  from datacontract.engines.ibis.connections.aws_credentials import resolve_aws_credentials
9
11
  from datacontract.export.duckdb_type_converter import convert_to_duckdb_csv_type, convert_to_duckdb_json_type
10
12
  from datacontract.export.sql_type_converter import convert_to_duckdb
@@ -507,8 +509,17 @@ def _load_extension(con, name: str, extra: str) -> None:
507
509
  ) from e
508
510
 
509
511
 
510
- def _attach_mysql(con, host: str, port: int, user: str, password: str, database: str | None) -> None:
512
+ def _attach_mysql(
513
+ con,
514
+ host: str,
515
+ port: int,
516
+ user: str,
517
+ password: str,
518
+ database: str | None,
519
+ connect_timeout: int = DEFAULT_CONNECT_TIMEOUT,
520
+ ) -> None:
511
521
  """ATTACH MySQL as ``mysqldb``; the password goes in a secret, as DuckDB echoes the ATTACH string in its errors."""
522
+ _wait_for_mysql_greeting(host, port, connect_timeout)
512
523
  parts = [f"host={host}", f"port={port}", f"user={user}"]
513
524
  if database:
514
525
  parts.append(f"database={database}")
@@ -520,6 +531,38 @@ def _attach_mysql(con, host: str, port: int, user: str, password: str, database:
520
531
  con.execute("DROP TEMPORARY SECRET mysqldb_password")
521
532
 
522
533
 
534
+ def _wait_for_mysql_greeting(host: str, port: int, timeout: int) -> None:
535
+ """Fail fast on a MySQL server that does not answer.
536
+
537
+ DuckDB's mysql extension has no connect timeout and waits forever for a server that
538
+ accepts the connection but never answers, e.g. on a wrong port. A MySQL server sends
539
+ its handshake as soon as the connection is open, so waiting for the first byte tells
540
+ the two apart. ``localhost`` is skipped: the MySQL client connects there over the
541
+ Unix socket, not TCP.
542
+ """
543
+ from datacontract.model.exceptions import DataContractException
544
+ from datacontract.model.run import ResultEnum
545
+
546
+ if host == "localhost":
547
+ return
548
+ try:
549
+ with socket.create_connection((host, port), timeout=timeout) as sock:
550
+ if sock.recv(1):
551
+ return
552
+ reason = f"MySQL server {host}:{port} closed the connection without a handshake."
553
+ except TimeoutError:
554
+ reason = f"MySQL server {host}:{port} did not answer within {timeout} seconds."
555
+ except OSError as e:
556
+ reason = f"Could not connect to MySQL server {host}:{port}: {e}"
557
+ raise DataContractException(
558
+ type="connection",
559
+ name="Connect to mysql",
560
+ result=ResultEnum.error,
561
+ reason=reason,
562
+ engine="datacontract-cli",
563
+ )
564
+
565
+
523
566
  def _sql_literal(value) -> str:
524
567
  """Escape a value for a single-quoted duckdb string literal.
525
568
 
@@ -281,7 +281,7 @@ def _read_information_schema(con, server: Server, model: str) -> Optional[dict[s
281
281
  query = (
282
282
  "SELECT column_name, data_type, character_maximum_length, "
283
283
  "numeric_precision, numeric_scale, datetime_precision "
284
- f"FROM information_schema.columns WHERE upper(table_name) = upper('{_quote(model)}')"
284
+ f"FROM INFORMATION_SCHEMA.COLUMNS WHERE upper(table_name) = upper('{_quote(model)}')"
285
285
  f"{_schema_filter(server)}"
286
286
  )
287
287
  return _map_reconstructed(con, query)