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