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.
- {datacontract_cli-1.2.4/datacontract_cli.egg-info → datacontract_cli-1.2.5}/PKG-INFO +2 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/README.md +1 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/api.py +5 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_edit.py +30 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/settings.py +9 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/data_contract.py +11 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/create_checks.py +9 -2
- datacontract_cli-1.2.5/datacontract/engines/ibis/connections/athena_patch.py +20 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/connect.py +11 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/duckdb_connection.py +44 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/native_type.py +1 -1
- datacontract_cli-1.2.5/datacontract/imports/postgres_importer.py +424 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/sql_importer.py +1 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/sqlserver_importer.py +4 -4
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/dbt_sync.py +11 -19
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/resolve.py +109 -44
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5/datacontract_cli.egg-info}/PKG-INFO +2 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/SOURCES.txt +2 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/pyproject.toml +1 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_api.py +6 -3
- datacontract_cli-1.2.5/tests/test_api_concurrency.py +186 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config.py +5 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_athena.py +17 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_mysql.py +84 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_postgres.py +10 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_redshift.py +10 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_sqlserver.py +15 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dbt_sync.py +6 -6
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_edit.py +36 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_markdown.py +1 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_spark.py +2 -2
- datacontract_cli-1.2.5/tests/test_import_postgres.py +396 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_postgres.py +6 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint.py +95 -10
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_azure_remote.py +4 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_bigquery.py +5 -4
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_checks_filter.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_databricks.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_delta.py +4 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_dimension_filter.py +2 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_dry_run.py +5 -4
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_gcs_csv_remote.py +4 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_gcs_json_remote.py +4 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka_remote.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_json_nd.py +2 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_mysql.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_oracle.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_oracle_xe.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_parquet.py +8 -4
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_postgres.py +5 -4
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_local_fallback.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_csv.py +4 -3
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_delta.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_complex.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_multiple_models.py +2 -1
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_snowflake.py +3 -2
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_sqlserver.py +3 -2
- datacontract_cli-1.2.5/tests/test_test_trino.py +187 -0
- datacontract_cli-1.2.4/datacontract/imports/postgres_importer.py +0 -259
- datacontract_cli-1.2.4/tests/test_import_postgres.py +0 -187
- datacontract_cli-1.2.4/tests/test_test_trino.py +0 -99
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/LICENSE +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/MANIFEST.in +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/detector.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/breaking/rules.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/catalog/catalog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/changelog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/changelog/normalize.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/cli.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_api.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_breaking.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_catalog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_changelog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_ci.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_dbt.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_export.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_import.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_init.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_lint.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_publish.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/command_test.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/cli_context.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/config/variables.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/VERSION +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/datacontract-editor.css +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/index.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/odcs.svg +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/robots.txt +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/rolldown-runtime-DY7j01NX.js +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/editor_assets/sitemap.xml +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/check_filter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/check_spec.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/custom_quality_check.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/dimensions.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/physical_type_match.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/severity.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/sql_guard.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/type_normalize.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/data_contract_test.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_azure_blob_file.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/check_hana_execute.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_check_selection.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_connection.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_quality_check.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_schema_check.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/hana/hana_type_mapping.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/aws_credentials.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/databricks_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/exasol_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/hive_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/iceberg.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/kafka.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/redshift_credentials.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/dtype_category.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/ibis_check_execute.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/snowflake_structured_types.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/avro_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/avro_idl_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/bigquery_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/custom_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/data_caterer_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dbml_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dbt_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dcs_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/dqx_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/duckdb_type_converter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/excel_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/exporter_factory.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/go_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/great_expectations_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/html_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/iceberg_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/jsonschema_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/markdown_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/mermaid_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/odcs_v3_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/pandas_type_converter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/protobuf_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/pydantic_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/rdf_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sodacl_check_builder.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sodacl_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/spark_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sql_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sql_type_converter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/sqlalchemy_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/export/xsd_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/athena_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/avro_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/bigquery_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/clickhouse_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/csv_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dbml_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dbt_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/dcs_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/excel_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/glue_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/hive_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/iceberg_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/importer_factory.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/json_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/jsonschema_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/mysql_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/object_storage_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odata_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odcs_helper.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/odcs_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/openapi_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/oracle_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/parquet_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/powerbi_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/protobuf_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/pydantic_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/redshift_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/snowflake_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/spark_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/spark_type_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/trino_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/unity_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/imports/xsd_importer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/init/init_template.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/dbt_test_mapping.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/integration/entropy_data.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/constraints.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/files.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/resources.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/s3.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/schema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/lint/urls.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/breaking.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/changelog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/enum_values.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/exceptions.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/map_type.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/natural_keys.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/odcs.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/run.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/server.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/vector_type.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/model/workbook.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/__init__.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/ci_output.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/json_test_results.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/junit_test_results.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/output_format.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/test_results_writer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/text_breaking_results.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/output/text_changelog_results.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/py.typed +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.2.0.init.yaml +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/schemas/odcs-3.2.0.schema.json +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/datacontract.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/datacontract_odcs.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.0.xlsx +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.1.xlsx +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/excel/odcs-template-v3.2.xlsx +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/index.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/authoritative_definitions.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/context.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/schema.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/server.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/macros/support.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_information.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/datacontract_terms.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/definition.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/example.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/model_field.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/quality.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials/server.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/context.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/custom_properties.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/diagram.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/dialog_yaml.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/footer.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/fundamentals.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/header.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/pricing.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/roles.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/schema.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/servers.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/sla.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/support.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/team.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/term_of_use.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/partials_odcs/title.html +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/templates/style/output.css +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/dependency_links.txt +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/entry_points.txt +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/requires.txt +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract_cli.egg-info/top_level.txt +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/setup.cfg +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_api_openapi.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_breaking.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_breaking_odcs_3_2.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_catalog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_engine.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_normalize.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_changelog_output_text.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_check_quality_provenance.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ci_output.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_cli.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_command_api.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_command_api_options.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_file.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_require.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_config_threading.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_bigquery.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_clickhouse.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_databricks.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_exasol.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_hive.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_impala.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_oracle.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_s3_credentials.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_snowflake.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_connect_trino.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_array_items.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_nested.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_nested_type.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_physical_type.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_primary_key.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_retention_period.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_servicelevel.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_create_checks_sql_placeholders.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_custom_quality_checks.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract_checks.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_data_contract_specification.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dbt_test_mapping.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_description_linter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_commands.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_config_options.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_docs_ordering.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_download_datacontract_file.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_dtype_category.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_duckdb_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_enum_values.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_avro.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_avro_idl.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_bigquery.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_complex_data_contract.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom_exporter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_custom_model.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_data_caterer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbml.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_models.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_sources.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dbt_staging_sql.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dcs.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_dqx.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_excel.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_go.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_great_expectations.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_html.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_iceberg.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_jsonschema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_large_contract.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_mermaid.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_odcs_v3.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_protobuf.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_pydantic.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_rdf.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sodacl.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql_clickhouse.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sql_query.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_sqlalchemy.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_export_xsd.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_connection.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_quality_check.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_schema_check.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_hana_type_mapping.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_check_execute.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_mssql_pattern.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_mssql_schema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_ibis_oracle_schema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_athena.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_avro.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_bigquery.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_clickhouse.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_csv.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_dbml.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_dbt.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_excel.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_glue.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_hive.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_iceberg.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_jsonschema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_mysql.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_object_storage.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_odata.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_odcs_v3.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_openapi.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_oracle.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_parquet.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_powerbi.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_protobuf.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_pydantic_model.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_redshift.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_snowflake.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_spark_type_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_clickhouse.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_hive.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_oracle.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_snowflake.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_sqlserver.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sql_struct.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_sqlserver.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_trino.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_unity_file.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_unmapped_types.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_import_xsd.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_install_extras.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_integration_entropydata.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_files.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_odcs_3_2_constraints.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_schema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_lint_urls.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_map_type.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_metadata_fields.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_native_type_schema_scope.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_nested_path_checks.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_oracle_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_physical_type_match.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_publish_test_results.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_publish_test_results_payload.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_quality_sql_dialects.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_quality_unrunnable_rules.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_redshift_credentials.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_redshift_patch.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve_definitions.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_resolve_local_definitions.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_jsonschema.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_pydantic_model.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_roundtrip_xsd.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_row_filter_duplicate_count.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_run_check_deprecated_fields.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_run_check_engine.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_overrides.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_type_mssql.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_server_type_synonyms.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_servers_3_2_0.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_snowflake_structured_types.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_sql_type_converter_physicaltype.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_api.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_api_openapi_import.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_array_items.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_athena_iceberg.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_azure_blob_file.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_clickhouse.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_diagnostics.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_duckdb.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_failed_samples.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_hana.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_hive.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg_rest.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_iceberg_s3tables.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_kafka_decoding.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_local_xml.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_metadata_only.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_nested_checks.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_output_json.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_output_junit.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_id_and_tag_filter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_quality_percent_severity.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_redshift.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_relationships.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_results_writer.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_row_filter.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_s3_json_multiple_files.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_schema_evolution.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_server_not_found.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_soda_connection_error.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_test_variables.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_type_normalize.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_untrusted_contract.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_untrusted_contract_variables.py +0 -0
- {datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/tests/test_variables.py +0 -0
- {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.
|
|
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&style=social" alt="Slack Status" data-canonical-src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&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&style=social" alt="Slack Status" data-canonical-src="https://img.shields.io/badge/slack-join_chat-white.svg?logo=slack&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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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,
|
{datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/checks/create_checks.py
RENAMED
|
@@ -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
|
-
|
|
47
|
-
|
|
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()
|
{datacontract_cli-1.2.4 → datacontract_cli-1.2.5}/datacontract/engines/ibis/connections/connect.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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)
|