datacontract-cli 1.1.0__tar.gz → 1.1.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/MANIFEST.in +1 -0
- {datacontract_cli-1.1.0/datacontract_cli.egg-info → datacontract_cli-1.1.1}/PKG-INFO +6 -3
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/README.md +2 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/api.py +307 -49
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_api.py +1 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_ci.py +8 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_export.py +1 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_import.py +20 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_test.py +55 -9
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/data_contract.py +3 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/check_spec.py +16 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/create_checks.py +4 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/data_contract_test.py +12 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_azure_blob_file.py +1 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/connect.py +6 -0
- datacontract_cli-1.1.1/datacontract/engines/ibis/connections/databricks_patch.py +142 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/ibis_check_execute.py +39 -30
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/excel_exporter.py +13 -6
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/exporter.py +2 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/pydantic_exporter.py +7 -2
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sodacl_check_builder.py +16 -13
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sql_type_converter.py +9 -2
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/importer.py +1 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/importer_factory.py +5 -0
- datacontract_cli-1.1.1/datacontract/imports/pydantic_importer.py +454 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/unity_importer.py +0 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/dbt_sync.py +1 -1
- datacontract_cli-1.1.1/datacontract/model/changelog.py +50 -0
- datacontract_cli-1.1.1/datacontract/model/run.py +258 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/ci_output.py +2 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/junit_test_results.py +10 -3
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/test_results_writer.py +7 -3
- datacontract_cli-1.1.1/datacontract/templates/excel/odcs-template.xlsx +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1/datacontract_cli.egg-info}/PKG-INFO +6 -3
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/SOURCES.txt +8 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/requires.txt +3 -2
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/pyproject.toml +4 -3
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_api.py +47 -0
- datacontract_cli-1.1.1/tests/test_api_openapi.py +123 -0
- datacontract_cli-1.1.1/tests/test_create_checks_sql_placeholders.py +44 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract_checks.py +41 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dbt_sync.py +1 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_commands.py +6 -16
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_ordering.py +4 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_excel.py +61 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_pydantic.py +22 -0
- datacontract_cli-1.1.1/tests/test_import_pydantic_model.py +147 -0
- datacontract_cli-1.1.1/tests/test_run_check_deprecated_fields.py +65 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_sql_type_converter_physicaltype.py +19 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_api.py +27 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_azure_blob_file.py +1 -1
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_checks_filter.py +18 -0
- datacontract_cli-1.1.1/tests/test_test_databricks.py +144 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_failed_samples.py +8 -8
- datacontract_cli-1.1.1/tests/test_test_metadata_only.py +232 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_id_and_tag_filter.py +3 -3
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_row_filter.py +4 -0
- datacontract_cli-1.1.0/datacontract/model/changelog.py +0 -29
- datacontract_cli-1.1.0/datacontract/model/run.py +0 -131
- datacontract_cli-1.1.0/tests/test_test_databricks.py +0 -53
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/LICENSE +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/catalog/catalog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/changelog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/normalize.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/cli.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_catalog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_changelog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_dbt.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_edit.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_init.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_lint.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_publish.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/cli_context.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/settings.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/VERSION +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/datacontract-editor.css +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/index.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/java-B260NeH3.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/odcs.svg +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/check_filter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/dimensions.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/physical_type_match.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/type_normalize.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/aws_credentials.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/kafka.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/redshift_credentials.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/dtype_category.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/native_type.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/snowflake_structured_types.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/avro_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/avro_idl_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/bigquery_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/custom_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/data_caterer_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dbml_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dbt_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dcs_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dqx_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/duckdb_type_converter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/exporter_factory.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/go_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/great_expectations_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/html_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/iceberg_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/jsonschema_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/markdown_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/mermaid_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/odcs_export_helper.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/odcs_v3_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/pandas_type_converter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/protobuf_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/rdf_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sodacl_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/spark_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sql_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sqlalchemy_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/athena_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/avro_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/bigquery_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/csv_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dbml_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dbt_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dcs_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/excel_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/glue_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/iceberg_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/json_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/jsonschema_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/mysql_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/object_storage_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/odcs_helper.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/odcs_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/oracle_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/parquet_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/postgres_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/powerbi_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/protobuf_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/redshift_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/snowflake_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/spark_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/spark_type_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/sql_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/sqlserver_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/trino_importer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/init/init_template.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/dbt_test_mapping.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/entropy_data.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/files.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/resolve.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/resources.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/s3.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/schema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/urls.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/exceptions.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/odcs.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/server.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/__init__.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/json_test_results.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/output_format.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/text_changelog_results.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/py.typed +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/datacontract.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/datacontract_odcs.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/index.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/authoritative_definitions.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/schema.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/server.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/support.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_information.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_terms.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/definition.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/example.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/model_field.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/quality.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/server.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/custom_properties.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/diagram.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/dialog_yaml.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/footer.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/fundamentals.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/header.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/pricing.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/roles.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/schema.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/servers.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/sla.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/support.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/team.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/term_of_use.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/title.html +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/style/output.css +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/dependency_links.txt +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/entry_points.txt +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/top_level.txt +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/setup.cfg +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_catalog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_engine.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_normalize.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_output_text.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ci_output.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_cli.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_file.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_require.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_threading.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_athena.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_bigquery.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_databricks.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_impala.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_mysql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_oracle.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_postgres.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_redshift.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_s3_credentials.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_snowflake.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_sqlserver.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_trino.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_nested_type.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_physical_type.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_primary_key.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract_specification.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dbt_test_mapping.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_description_linter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_config_options.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_download_datacontract_file.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dtype_category.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_duckdb_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_edit.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_avro.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_avro_idl.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_bigquery.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_complex_data_contract.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom_exporter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom_model.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_data_caterer.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbml.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_models.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_sources.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_staging_sql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dqx.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_go.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_great_expectations.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_html.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_iceberg.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_jsonschema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_markdown.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_mermaid.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_odcs_v3.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_protobuf.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_rdf.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sodacl.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_spark.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql_clickhouse.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql_query.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sqlalchemy.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_mssql_pattern.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_mssql_schema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_oracle_schema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_athena.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_avro.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_bigquery.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_csv.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_dbml.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_dbt.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_excel.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_glue.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_iceberg.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_jsonschema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_mysql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_object_storage.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_odcs_v3.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_oracle.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_parquet.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_postgres.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_powerbi.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_protobuf.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_redshift.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_snowflake.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_spark_type_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_oracle.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_postgres.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_snowflake.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_sqlserver.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sqlserver.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_trino.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_unity_file.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_install_extras.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_integration_entropydata.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_lint.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_native_type_schema_scope.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_oracle_patch.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_physical_type_match.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_redshift_credentials.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_redshift_patch.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_resolve.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_resolve_definitions.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_roundtrip_jsonschema.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_server_type_mssql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_snowflake_structured_types.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_athena_iceberg.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_azure_remote.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_bigquery.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_delta.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_diagnostics.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_dimension_filter.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_gcs_csv_remote.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_gcs_json_remote.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka_decoding.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka_remote.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_local_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_local_json_nd.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_mysql.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_oracle.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_oracle_xe.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_output_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_output_junit.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_parquet.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_postgres.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_local_fallback.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_percent_severity.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_redshift.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_csv.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_delta.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_complex.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_multiple_models.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_remote.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_schema_evolution.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_server_not_found.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_snowflake.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_soda_connection_error.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_sqlserver.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_trino.py +0 -0
- {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_type_normalize.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datacontract-cli
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.1
|
|
4
4
|
Summary: The datacontract CLI is an open source command-line tool for working with Data Contracts. It uses data contract YAML files to lint the data contract, connect to data sources and execute schema and quality tests, detect breaking changes, and export to different formats. The tool is written in Python. It can be used as a standalone CLI tool, in a CI/CD pipeline, or directly as a Python library.
|
|
5
5
|
Author-email: Jochen Christ <jochen.christ@entropy-data.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@entropy-data.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -67,7 +67,7 @@ Requires-Dist: rich>=12.4.4; extra == "dataframe"
|
|
|
67
67
|
Provides-Extra: databricks
|
|
68
68
|
Requires-Dist: ibis-framework[databricks]<13.0.0,>=10.0.0; extra == "databricks"
|
|
69
69
|
Requires-Dist: databricks-sql-connector<4.5.0,>=3.7.0; extra == "databricks"
|
|
70
|
-
Requires-Dist: databricks-sdk<0.
|
|
70
|
+
Requires-Dist: databricks-sdk<0.126.0; extra == "databricks"
|
|
71
71
|
Requires-Dist: packaging<27.0,>=21.3; extra == "databricks"
|
|
72
72
|
Provides-Extra: databricks-runtime
|
|
73
73
|
Requires-Dist: datacontract-cli[databricks]; extra == "databricks-runtime"
|
|
@@ -139,6 +139,7 @@ Requires-Dist: httpx==0.28.1; extra == "dev"
|
|
|
139
139
|
Requires-Dist: kafka-python; extra == "dev"
|
|
140
140
|
Requires-Dist: minio==7.2.20; extra == "dev"
|
|
141
141
|
Requires-Dist: moto==5.2.2; extra == "dev"
|
|
142
|
+
Requires-Dist: openapi-spec-validator<0.10,>=0.7; extra == "dev"
|
|
142
143
|
Requires-Dist: pandas>=2.1.0; extra == "dev"
|
|
143
144
|
Requires-Dist: pre-commit<4.7.0,>=3.7.1; extra == "dev"
|
|
144
145
|
Requires-Dist: pytest; extra == "dev"
|
|
@@ -146,7 +147,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
|
146
147
|
Requires-Dist: pymssql==2.3.13; extra == "dev"
|
|
147
148
|
Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
|
|
148
149
|
Requires-Dist: mysql-connector-python<26.8.0,>=8.0.30; extra == "dev"
|
|
149
|
-
Requires-Dist: ruff==0.16.
|
|
150
|
+
Requires-Dist: ruff==0.16.2; extra == "dev"
|
|
150
151
|
Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.15.0; extra == "dev"
|
|
151
152
|
Requires-Dist: trino==0.338.0; extra == "dev"
|
|
152
153
|
Dynamic: license-file
|
|
@@ -399,6 +400,8 @@ alias datacontract='docker run --rm -v "${PWD}:/home/datacontract" datacontract/
|
|
|
399
400
|
|
|
400
401
|
_Note:_ The output of Docker command line messages is limited to 80 columns and may include line breaks. Don't pipe docker output to files if you want to export code. Use the `--output` option instead.
|
|
401
402
|
|
|
403
|
+
Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signing/overview/) keyless signing. See [Verifying the image](https://docs.datacontract.com/installation#verifying-the-image) to check a signature before you run it.
|
|
404
|
+
|
|
402
405
|
|
|
403
406
|
|
|
404
407
|
## Optional Dependencies (Extras)
|
|
@@ -246,6 +246,8 @@ alias datacontract='docker run --rm -v "${PWD}:/home/datacontract" datacontract/
|
|
|
246
246
|
|
|
247
247
|
_Note:_ The output of Docker command line messages is limited to 80 columns and may include line breaks. Don't pipe docker output to files if you want to export code. Use the `--output` option instead.
|
|
248
248
|
|
|
249
|
+
Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signing/overview/) keyless signing. See [Verifying the image](https://docs.datacontract.com/installation#verifying-the-image) to check a signature before you run it.
|
|
250
|
+
|
|
249
251
|
|
|
250
252
|
|
|
251
253
|
## Optional Dependencies (Extras)
|
|
@@ -2,21 +2,22 @@ import json
|
|
|
2
2
|
import logging
|
|
3
3
|
import os
|
|
4
4
|
import tempfile
|
|
5
|
+
from importlib import metadata
|
|
5
6
|
from typing import Annotated, Optional
|
|
6
7
|
|
|
7
8
|
import pydantic
|
|
8
|
-
import typer
|
|
9
9
|
import yaml
|
|
10
10
|
from fastapi import Body, Depends, FastAPI, HTTPException, Query, Request, status
|
|
11
11
|
from fastapi.middleware.cors import CORSMiddleware
|
|
12
12
|
from fastapi.responses import PlainTextResponse
|
|
13
13
|
from fastapi.security.api_key import APIKeyHeader
|
|
14
|
-
from pydantic import BaseModel, ValidationError
|
|
14
|
+
from pydantic import BaseModel, Field, ValidationError
|
|
15
15
|
|
|
16
16
|
from datacontract.config import Config, known_env_names
|
|
17
17
|
from datacontract.data_contract import DataContract, ExportFormat
|
|
18
|
+
from datacontract.model.changelog import ChangelogEntry
|
|
18
19
|
from datacontract.model.exceptions import DataContractException
|
|
19
|
-
from datacontract.model.run import Run
|
|
20
|
+
from datacontract.model.run import Check, ResultEnum, Run
|
|
20
21
|
|
|
21
22
|
DATA_CONTRACT_EXAMPLE_PAYLOAD = """apiVersion: v3.1.0
|
|
22
23
|
kind: DataContract
|
|
@@ -225,40 +226,114 @@ def _require_schema_url(schema: str | None) -> str | None:
|
|
|
225
226
|
return schema
|
|
226
227
|
|
|
227
228
|
|
|
229
|
+
def _cli_version() -> str:
|
|
230
|
+
try:
|
|
231
|
+
return metadata.version("datacontract-cli")
|
|
232
|
+
except metadata.PackageNotFoundError:
|
|
233
|
+
return "0.0.0"
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
API_DESCRIPTION = """
|
|
237
|
+
The Data Contract CLI as a web server. Every endpoint takes an
|
|
238
|
+
[ODCS](https://bitol-io.github.io/open-data-contract-standard/) data contract and runs one of the
|
|
239
|
+
CLI commands against it, so anything `datacontract test|lint|export|changelog` can do on the command
|
|
240
|
+
line can be done over HTTP.
|
|
241
|
+
|
|
242
|
+
The data contract is the request body: `POST` it as `application/yaml` (or as a JSON string) —
|
|
243
|
+
there is no contract storage, every request is self-contained.
|
|
244
|
+
|
|
245
|
+
## Authentication
|
|
246
|
+
|
|
247
|
+
Authentication is off unless the server was started with the environment variable
|
|
248
|
+
`DATACONTRACT_CLI_API_KEY` set. When it is set, every endpoint requires the header `x-api-key` with
|
|
249
|
+
that value, and answers `401` when the header is missing and `403` when it is wrong.
|
|
250
|
+
|
|
251
|
+
Securing the API is strongly recommended: `POST /test` connects to your data sources, and test
|
|
252
|
+
results may contain sensitive information.
|
|
253
|
+
|
|
254
|
+
## Connecting to data sources
|
|
255
|
+
|
|
256
|
+
`POST /test` needs credentials for the server described in the contract's `servers` section. Provide
|
|
257
|
+
them either as environment variables when starting the server, or per request as `datacontract-*`
|
|
258
|
+
headers, which are matched case-insensitively and map mechanically to the environment variable names
|
|
259
|
+
(`datacontract-snowflake-password` sets `DATACONTRACT_SNOWFLAKE_PASSWORD` for that request only).
|
|
260
|
+
Per-request headers are never written to the process environment, so one server can serve several
|
|
261
|
+
tenants. Send them over HTTPS only.
|
|
262
|
+
|
|
263
|
+
See [Configuration](https://docs.datacontract.com/configuration) for the full list of options.
|
|
264
|
+
"""
|
|
265
|
+
|
|
228
266
|
app = FastAPI(
|
|
229
267
|
docs_url="/",
|
|
230
268
|
title="Data Contract CLI API",
|
|
231
|
-
summary="
|
|
269
|
+
summary="Test, lint, export, and compare data contracts over HTTP.",
|
|
270
|
+
description=API_DESCRIPTION,
|
|
271
|
+
version=_cli_version(),
|
|
232
272
|
license_info={
|
|
233
273
|
"name": "MIT License",
|
|
234
274
|
"identifier": "MIT",
|
|
235
275
|
},
|
|
236
|
-
contact={
|
|
276
|
+
contact={
|
|
277
|
+
"name": "Data Contract CLI",
|
|
278
|
+
"url": "https://docs.datacontract.com/",
|
|
279
|
+
},
|
|
280
|
+
# Relative, so the document works for any deployment. A second, absolute entry would
|
|
281
|
+
# show up as a target in the Swagger UI dropdown and invite sending contracts there.
|
|
282
|
+
servers=[{"url": "/", "description": "The server this document was loaded from"}],
|
|
237
283
|
openapi_tags=[
|
|
238
284
|
{
|
|
239
285
|
"name": "test",
|
|
286
|
+
"description": "Run the schema and quality tests of a data contract against the actual data.",
|
|
240
287
|
"externalDocs": {
|
|
241
288
|
"description": "Documentation",
|
|
242
|
-
"url": "https://
|
|
289
|
+
"url": "https://docs.datacontract.com/testing/",
|
|
243
290
|
},
|
|
244
291
|
},
|
|
245
292
|
{
|
|
246
293
|
"name": "lint",
|
|
294
|
+
"description": "Validate that a data contract is syntactically correct and follows the standard.",
|
|
247
295
|
"externalDocs": {
|
|
248
296
|
"description": "Documentation",
|
|
249
|
-
"url": "https://
|
|
297
|
+
"url": "https://docs.datacontract.com/commands/lint",
|
|
250
298
|
},
|
|
251
299
|
},
|
|
252
300
|
{
|
|
253
301
|
"name": "export",
|
|
302
|
+
"description": "Convert a data contract into another format, such as SQL DDL, Avro, or dbt.",
|
|
303
|
+
"externalDocs": {
|
|
304
|
+
"description": "Documentation",
|
|
305
|
+
"url": "https://docs.datacontract.com/exports/",
|
|
306
|
+
},
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
"name": "changelog",
|
|
310
|
+
"description": "Compare two versions of a data contract and list what changed.",
|
|
254
311
|
"externalDocs": {
|
|
255
312
|
"description": "Documentation",
|
|
256
|
-
"url": "https://
|
|
313
|
+
"url": "https://docs.datacontract.com/commands/changelog",
|
|
257
314
|
},
|
|
258
315
|
},
|
|
259
316
|
],
|
|
260
317
|
)
|
|
261
318
|
|
|
319
|
+
_fastapi_openapi = app.openapi
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
def _openapi_with_external_docs() -> dict:
|
|
323
|
+
"""Add the document-level `externalDocs`, which FastAPI has no constructor argument for."""
|
|
324
|
+
schema = _fastapi_openapi()
|
|
325
|
+
schema.setdefault(
|
|
326
|
+
"externalDocs",
|
|
327
|
+
{
|
|
328
|
+
"description": "Data Contract CLI documentation",
|
|
329
|
+
"url": "https://docs.datacontract.com/api",
|
|
330
|
+
},
|
|
331
|
+
)
|
|
332
|
+
return schema
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
app.openapi = _openapi_with_external_docs
|
|
336
|
+
|
|
262
337
|
app.add_middleware(
|
|
263
338
|
CORSMiddleware,
|
|
264
339
|
allow_origins=["*"],
|
|
@@ -268,10 +343,57 @@ app.add_middleware(
|
|
|
268
343
|
|
|
269
344
|
api_key_header = APIKeyHeader(
|
|
270
345
|
name="x-api-key",
|
|
346
|
+
description="The secret the server was started with in the environment variable "
|
|
347
|
+
"`DATACONTRACT_CLI_API_KEY`. Only required if that variable is set.",
|
|
271
348
|
auto_error=False, # this makes authentication optional
|
|
272
349
|
)
|
|
273
350
|
|
|
274
351
|
|
|
352
|
+
class ErrorResponse(BaseModel):
|
|
353
|
+
"""The body returned for a request that could not be handled."""
|
|
354
|
+
|
|
355
|
+
detail: str = Field(
|
|
356
|
+
description="A human-readable explanation of why the request failed.",
|
|
357
|
+
examples=["Missing API key. Use Header 'x-api-key' to provide the API key."],
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
class RequestValidationErrorItem(BaseModel):
|
|
362
|
+
"""A single violation found while validating the request itself."""
|
|
363
|
+
|
|
364
|
+
loc: list[str | int] = Field(description="The path to the offending part of the request.")
|
|
365
|
+
msg: str = Field(description="What is wrong with it.")
|
|
366
|
+
type: str = Field(description="The machine-readable error type.")
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class UnprocessableEntityResponse(BaseModel):
|
|
370
|
+
"""The body returned for a request that is well-formed but cannot be processed."""
|
|
371
|
+
|
|
372
|
+
detail: str | list[RequestValidationErrorItem] = Field(
|
|
373
|
+
description="A message explaining why the request was rejected, or — when the request itself "
|
|
374
|
+
"failed validation — one entry per violation.",
|
|
375
|
+
examples=["The schema parameter must be an http:// or https:// URL."],
|
|
376
|
+
)
|
|
377
|
+
|
|
378
|
+
|
|
379
|
+
AUTHENTICATION_RESPONSES: dict[int | str, dict] = {
|
|
380
|
+
401: {
|
|
381
|
+
"description": "The API key is missing (only when the server runs with DATACONTRACT_CLI_API_KEY set).",
|
|
382
|
+
"model": ErrorResponse,
|
|
383
|
+
"content": {
|
|
384
|
+
"application/json": {
|
|
385
|
+
"example": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."}
|
|
386
|
+
}
|
|
387
|
+
},
|
|
388
|
+
},
|
|
389
|
+
403: {
|
|
390
|
+
"description": "The provided API key is not correct.",
|
|
391
|
+
"model": ErrorResponse,
|
|
392
|
+
"content": {"application/json": {"example": {"detail": "The provided API key is not correct."}}},
|
|
393
|
+
},
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
|
|
275
397
|
_CONFIG_HEADER_PREFIX = "datacontract-"
|
|
276
398
|
|
|
277
399
|
|
|
@@ -348,33 +470,40 @@ def check_api_key(api_key_header: str | None):
|
|
|
348
470
|
@app.post(
|
|
349
471
|
"/test",
|
|
350
472
|
tags=["test"],
|
|
351
|
-
|
|
473
|
+
operation_id="testDataContract",
|
|
474
|
+
summary="Run the tests of a data contract",
|
|
352
475
|
description="""
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
476
|
+
Run the schema and quality tests of a data contract against the actual data. The Data Contract CLI
|
|
477
|
+
connects to the data source described by the contract's `servers` section, so this usually requires
|
|
478
|
+
credentials — set them as environment variables when starting the server, or send them per request
|
|
479
|
+
as `datacontract-*` headers (see the API description).
|
|
480
|
+
|
|
481
|
+
`POST` the data contract as `application/yaml`. The response is a test run with one check per
|
|
482
|
+
executed test; `result` is `passed` only if every check passed. Note that a failed test is a
|
|
483
|
+
`200 OK` with `"result": "failed"` — a non-2xx status means the request itself could not be
|
|
484
|
+
handled. A contract that cannot be parsed is reported the same way, as a failed check.
|
|
359
485
|
""",
|
|
486
|
+
response_description="The test run, with one check per executed test.",
|
|
360
487
|
responses={
|
|
361
|
-
|
|
362
|
-
|
|
488
|
+
**AUTHENTICATION_RESPONSES,
|
|
489
|
+
400: {
|
|
490
|
+
"description": "A `datacontract-*` header does not name a known configuration option, "
|
|
491
|
+
"or its value is not valid for that option.",
|
|
492
|
+
"model": ErrorResponse,
|
|
363
493
|
"content": {
|
|
364
494
|
"application/json": {
|
|
365
|
-
"
|
|
366
|
-
"
|
|
367
|
-
|
|
368
|
-
"value": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."},
|
|
369
|
-
},
|
|
370
|
-
"api_key_wrong": {
|
|
371
|
-
"summary": "API key Wrong",
|
|
372
|
-
"value": {"detail": "The provided API key is not correct."},
|
|
373
|
-
},
|
|
495
|
+
"example": {
|
|
496
|
+
"detail": "Invalid datacontract-* configuration header: "
|
|
497
|
+
"DATACONTRACT_SNOWFLAKE_LOGIN_TIMEOUT: input should be a valid integer"
|
|
374
498
|
}
|
|
375
499
|
}
|
|
376
500
|
},
|
|
377
501
|
},
|
|
502
|
+
422: {
|
|
503
|
+
"description": "`filter` and `filters` were both given, or `filters` is not a JSON object "
|
|
504
|
+
"mapping schema name to a SQL predicate.",
|
|
505
|
+
"model": UnprocessableEntityResponse,
|
|
506
|
+
},
|
|
378
507
|
},
|
|
379
508
|
response_model_exclude_none=True,
|
|
380
509
|
response_model_exclude_unset=True,
|
|
@@ -442,11 +571,39 @@ async def test(
|
|
|
442
571
|
).test()
|
|
443
572
|
|
|
444
573
|
|
|
574
|
+
class LintResponse(BaseModel):
|
|
575
|
+
"""The outcome of validating a data contract against the schema."""
|
|
576
|
+
|
|
577
|
+
result: ResultEnum = Field(
|
|
578
|
+
description="`passed` if the data contract is valid, otherwise the most severe check result.",
|
|
579
|
+
examples=["passed"],
|
|
580
|
+
)
|
|
581
|
+
checks: list[Check] = Field(
|
|
582
|
+
description="One entry per validation performed. A valid contract yields a single passed check; "
|
|
583
|
+
"an invalid one yields a failed check per schema violation.",
|
|
584
|
+
)
|
|
585
|
+
|
|
586
|
+
|
|
445
587
|
@app.post(
|
|
446
588
|
"/lint",
|
|
447
589
|
tags=["lint"],
|
|
448
|
-
|
|
449
|
-
|
|
590
|
+
operation_id="lintDataContract",
|
|
591
|
+
summary="Validate that a data contract is correctly formatted",
|
|
592
|
+
description="""
|
|
593
|
+
Validate that the data contract is syntactically correct and conforms to the Open Data Contract
|
|
594
|
+
Standard. No data source is contacted, so no credentials are needed.
|
|
595
|
+
|
|
596
|
+
An invalid contract is reported as a `200 OK` with `"result": "failed"` and one check per schema
|
|
597
|
+
violation — not as an error status. A `schema` that is not an `http(s)` URL is rejected with `422`.
|
|
598
|
+
""",
|
|
599
|
+
response_description="The lint result, with one check per validation performed.",
|
|
600
|
+
responses={
|
|
601
|
+
**AUTHENTICATION_RESPONSES,
|
|
602
|
+
422: {
|
|
603
|
+
"description": "The `schema` parameter is not an `http(s)` URL.",
|
|
604
|
+
"model": UnprocessableEntityResponse,
|
|
605
|
+
},
|
|
606
|
+
},
|
|
450
607
|
)
|
|
451
608
|
async def lint(
|
|
452
609
|
body: Annotated[
|
|
@@ -457,43 +614,81 @@ async def lint(
|
|
|
457
614
|
examples=[DATA_CONTRACT_EXAMPLE_PAYLOAD],
|
|
458
615
|
),
|
|
459
616
|
],
|
|
617
|
+
api_key: Annotated[str | None, Depends(api_key_header)] = None,
|
|
460
618
|
schema: Annotated[
|
|
461
619
|
str | None,
|
|
462
620
|
Query(
|
|
463
621
|
examples=["https://datacontract.com/datacontract.schema.json"],
|
|
464
|
-
description="The
|
|
622
|
+
description="The JSON Schema to validate against, as an `http(s)` URL. "
|
|
623
|
+
"Defaults to the schema for the contract's `apiVersion`.",
|
|
465
624
|
),
|
|
466
625
|
] = None,
|
|
467
626
|
all_errors: Annotated[
|
|
468
627
|
bool,
|
|
469
628
|
Query(description="Report all JSON Schema validation errors instead of only the first one."),
|
|
470
629
|
] = False,
|
|
471
|
-
):
|
|
630
|
+
) -> LintResponse:
|
|
631
|
+
check_api_key(api_key)
|
|
472
632
|
data_contract = DataContract(
|
|
473
633
|
data_contract_str=body, schema_location=_require_schema_url(schema), all_errors=all_errors
|
|
474
634
|
)
|
|
475
635
|
lint_result = data_contract.lint()
|
|
476
|
-
return
|
|
636
|
+
return LintResponse(result=lint_result.result, checks=lint_result.checks)
|
|
477
637
|
|
|
478
638
|
|
|
479
639
|
class ChangelogRequest(BaseModel):
|
|
480
|
-
|
|
481
|
-
|
|
640
|
+
"""The two data contract versions to compare."""
|
|
641
|
+
|
|
642
|
+
v1: str = Field(
|
|
643
|
+
default=DATA_CONTRACT_EXAMPLE_PAYLOAD,
|
|
644
|
+
title="Source Data Contract YAML",
|
|
645
|
+
description="The data contract as it was before, as a YAML string.",
|
|
646
|
+
)
|
|
647
|
+
v2: str = Field(
|
|
648
|
+
default=DATA_CONTRACT_EXAMPLE_PAYLOAD,
|
|
649
|
+
title="Target Data Contract YAML",
|
|
650
|
+
description="The data contract as it is now, as a YAML string.",
|
|
651
|
+
)
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
class ChangelogResponse(BaseModel):
|
|
655
|
+
"""The differences between two versions of a data contract."""
|
|
656
|
+
|
|
657
|
+
summary: list[ChangelogEntry] = Field(
|
|
658
|
+
description="One entry per changed element, rolled up to the level a reader cares about "
|
|
659
|
+
"(a renamed property is one entry, not one per changed attribute). Values are omitted.",
|
|
660
|
+
)
|
|
661
|
+
entries: list[ChangelogEntry] = Field(
|
|
662
|
+
description="Every individual change, with the old and new value.",
|
|
663
|
+
)
|
|
482
664
|
|
|
483
665
|
|
|
484
666
|
@app.post(
|
|
485
667
|
"/changelog",
|
|
486
668
|
tags=["changelog"],
|
|
487
|
-
|
|
669
|
+
operation_id="changelogBetweenDataContracts",
|
|
670
|
+
summary="Show a changelog between two data contracts",
|
|
488
671
|
description="""
|
|
489
|
-
|
|
490
|
-
|
|
672
|
+
Compare two versions of an ODCS data contract and return what changed between them. Useful to
|
|
673
|
+
decide whether a new version is a breaking change before publishing it.
|
|
674
|
+
|
|
675
|
+
`POST` a JSON body with `v1` (before) and `v2` (after) as YAML strings. A contract that cannot be
|
|
676
|
+
parsed is answered with `422`.
|
|
491
677
|
""",
|
|
678
|
+
response_description="The changelog, as a rolled-up summary and the individual changes.",
|
|
679
|
+
responses={
|
|
680
|
+
**AUTHENTICATION_RESPONSES,
|
|
681
|
+
422: {
|
|
682
|
+
"description": "One of the two data contracts is not valid YAML or not a valid data contract.",
|
|
683
|
+
"model": UnprocessableEntityResponse,
|
|
684
|
+
"content": {"application/json": {"example": {"detail": "Invalid YAML: while parsing a block mapping"}}},
|
|
685
|
+
},
|
|
686
|
+
},
|
|
492
687
|
)
|
|
493
688
|
async def changelog_endpoint(
|
|
494
689
|
body: ChangelogRequest,
|
|
495
690
|
api_key: Annotated[str | None, Depends(api_key_header)] = None,
|
|
496
|
-
):
|
|
691
|
+
) -> ChangelogResponse:
|
|
497
692
|
check_api_key(api_key)
|
|
498
693
|
|
|
499
694
|
with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f1:
|
|
@@ -505,7 +700,7 @@ async def changelog_endpoint(
|
|
|
505
700
|
|
|
506
701
|
try:
|
|
507
702
|
result = DataContract(data_contract_file=v1_path).changelog(DataContract(data_contract_file=v2_path))
|
|
508
|
-
return
|
|
703
|
+
return ChangelogResponse(summary=result.summary, entries=result.entries)
|
|
509
704
|
except yaml.YAMLError as e:
|
|
510
705
|
raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
|
|
511
706
|
except pydantic.ValidationError as e:
|
|
@@ -520,8 +715,53 @@ async def changelog_endpoint(
|
|
|
520
715
|
@app.post(
|
|
521
716
|
"/export",
|
|
522
717
|
tags=["export"],
|
|
523
|
-
|
|
718
|
+
operation_id="exportDataContract",
|
|
719
|
+
summary="Convert a data contract to another format",
|
|
720
|
+
description="""
|
|
721
|
+
Convert a data contract into another format, such as SQL DDL, Avro, Protobuf, dbt, or HTML.
|
|
722
|
+
|
|
723
|
+
The response is the converted document as `text/plain`; its actual syntax depends on the requested
|
|
724
|
+
`format`. Some formats have extra parameters, marked with the format they apply to in their
|
|
725
|
+
description.
|
|
726
|
+
""",
|
|
727
|
+
response_description="The data contract converted to the requested format.",
|
|
524
728
|
response_class=PlainTextResponse,
|
|
729
|
+
# Spelled out rather than reusing the shared entries, because a route with a
|
|
730
|
+
# non-JSON response_class would have FastAPI document every declared model in
|
|
731
|
+
# that media type — while errors are always returned as JSON.
|
|
732
|
+
responses={
|
|
733
|
+
200: {
|
|
734
|
+
"description": "The data contract converted to the requested format.",
|
|
735
|
+
"content": {
|
|
736
|
+
"text/plain": {
|
|
737
|
+
"schema": {"type": "string"},
|
|
738
|
+
"example": "CREATE TABLE orders (\n order_id UUID PRIMARY KEY,\n order_total INTEGER NOT NULL\n);",
|
|
739
|
+
}
|
|
740
|
+
},
|
|
741
|
+
},
|
|
742
|
+
401: {
|
|
743
|
+
"description": AUTHENTICATION_RESPONSES[401]["description"],
|
|
744
|
+
"content": {
|
|
745
|
+
"application/json": {
|
|
746
|
+
"schema": {"$ref": "#/components/schemas/ErrorResponse"},
|
|
747
|
+
"example": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."},
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
},
|
|
751
|
+
403: {
|
|
752
|
+
"description": AUTHENTICATION_RESPONSES[403]["description"],
|
|
753
|
+
"content": {
|
|
754
|
+
"application/json": {
|
|
755
|
+
"schema": {"$ref": "#/components/schemas/ErrorResponse"},
|
|
756
|
+
"example": {"detail": "The provided API key is not correct."},
|
|
757
|
+
}
|
|
758
|
+
},
|
|
759
|
+
},
|
|
760
|
+
422: {
|
|
761
|
+
"description": "The data contract could not be parsed, or is not a valid data contract.",
|
|
762
|
+
"content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnprocessableEntityResponse"}}},
|
|
763
|
+
},
|
|
764
|
+
},
|
|
525
765
|
)
|
|
526
766
|
def export(
|
|
527
767
|
body: Annotated[
|
|
@@ -532,7 +772,14 @@ def export(
|
|
|
532
772
|
examples=[DATA_CONTRACT_EXAMPLE_PAYLOAD],
|
|
533
773
|
),
|
|
534
774
|
],
|
|
535
|
-
format: Annotated[
|
|
775
|
+
format: Annotated[
|
|
776
|
+
ExportFormat,
|
|
777
|
+
Query(
|
|
778
|
+
description="The format to convert the data contract to.",
|
|
779
|
+
examples=["sql"],
|
|
780
|
+
),
|
|
781
|
+
],
|
|
782
|
+
api_key: Annotated[str | None, Depends(api_key_header)] = None,
|
|
536
783
|
server: Annotated[
|
|
537
784
|
str | None,
|
|
538
785
|
Query(
|
|
@@ -546,24 +793,35 @@ def export(
|
|
|
546
793
|
description="Use the key of the model in the data contract yaml file "
|
|
547
794
|
"to refer to a model, e.g., `orders`, or `all` for all "
|
|
548
795
|
"models (default).",
|
|
796
|
+
examples=["all"],
|
|
549
797
|
),
|
|
550
798
|
] = "all",
|
|
551
799
|
rdf_base: Annotated[
|
|
552
800
|
Optional[str],
|
|
553
|
-
|
|
801
|
+
Query(
|
|
802
|
+
description="[rdf] The base URI used to generate the RDF graph.",
|
|
803
|
+
examples=["https://example.com/"],
|
|
804
|
+
),
|
|
554
805
|
] = None,
|
|
555
806
|
sql_server_type: Annotated[
|
|
556
807
|
Optional[str],
|
|
557
808
|
Query(
|
|
558
809
|
description="[sql] The server type to determine the sql dialect. By default, it uses 'auto' to automatically detect the sql dialect via the specified servers in the data contract.",
|
|
810
|
+
examples=["postgres"],
|
|
559
811
|
),
|
|
560
812
|
] = None,
|
|
561
813
|
):
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
814
|
+
check_api_key(api_key)
|
|
815
|
+
try:
|
|
816
|
+
return DataContract(data_contract_str=body, server=server).export(
|
|
817
|
+
export_format=format,
|
|
818
|
+
model=model,
|
|
819
|
+
rdf_base=rdf_base,
|
|
820
|
+
sql_server_type=sql_server_type,
|
|
821
|
+
)
|
|
822
|
+
except yaml.YAMLError as e:
|
|
823
|
+
raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
|
|
824
|
+
except pydantic.ValidationError as e:
|
|
825
|
+
raise HTTPException(status_code=422, detail=f"Invalid data contract: {e}")
|
|
826
|
+
except DataContractException as e:
|
|
827
|
+
raise HTTPException(status_code=422, detail=f"Data Contract Validation Failure: {e}")
|
|
@@ -46,7 +46,7 @@ def api(
|
|
|
46
46
|
This is highly recommended, as data contract tests may be subject to SQL injections or leak sensitive information.
|
|
47
47
|
|
|
48
48
|
To connect to servers (such as a Snowflake data source), set the credentials as environment variables as documented in
|
|
49
|
-
https://
|
|
49
|
+
https://docs.datacontract.com/configuration
|
|
50
50
|
|
|
51
51
|
It is possible to run the API with extra arguments for `uvicorn.run()` as keyword arguments, e.g.:
|
|
52
52
|
`datacontract api --port 1234 --root_path /datacontract`.
|
|
@@ -61,6 +61,13 @@ def ci(
|
|
|
61
61
|
OutputFormat,
|
|
62
62
|
typer.Option(help="The target format for the test results. Accepted values: json, junit."),
|
|
63
63
|
] = None,
|
|
64
|
+
metadata_only: Annotated[
|
|
65
|
+
bool,
|
|
66
|
+
typer.Option(
|
|
67
|
+
help="Run only checks that read the schema (field presence and types). "
|
|
68
|
+
"Checks that read row values are skipped."
|
|
69
|
+
),
|
|
70
|
+
] = False,
|
|
64
71
|
logs: Annotated[bool, typer.Option(help="Print logs")] = False,
|
|
65
72
|
json_output: Annotated[bool, typer.Option("--json", help="Print test results as JSON to stdout.")] = False,
|
|
66
73
|
fail_on: Annotated[
|
|
@@ -119,6 +126,7 @@ def ci(
|
|
|
119
126
|
server=server,
|
|
120
127
|
ssl_verification=ssl_verification,
|
|
121
128
|
inline_references=inline_references,
|
|
129
|
+
metadata_only=metadata_only,
|
|
122
130
|
).test()
|
|
123
131
|
if logs:
|
|
124
132
|
_print_logs(run, out)
|
|
@@ -667,7 +667,7 @@ def export_excel(
|
|
|
667
667
|
location: location_arg = "datacontract.yaml",
|
|
668
668
|
template: Annotated[
|
|
669
669
|
Optional[str],
|
|
670
|
-
typer.Option(help="Path or URL to a custom Excel template."),
|
|
670
|
+
typer.Option(help="Path or URL to a custom Excel template. Defaults to the bundled ODCS template."),
|
|
671
671
|
] = None,
|
|
672
672
|
output: output_option = None,
|
|
673
673
|
server: server_option = None,
|
|
@@ -416,6 +416,26 @@ def import_protobuf(
|
|
|
416
416
|
_write_result(result, output)
|
|
417
417
|
|
|
418
418
|
|
|
419
|
+
@import_app.command(
|
|
420
|
+
name="pydantic-model",
|
|
421
|
+
epilog="Example: datacontract import pydantic-model --source models.py --output datacontract.yaml",
|
|
422
|
+
)
|
|
423
|
+
def import_pydantic_model(
|
|
424
|
+
source: Annotated[Optional[str], typer.Option(help="Path to the Python file defining the Pydantic models.")] = None,
|
|
425
|
+
output: output_option = None,
|
|
426
|
+
schema: schema_option = None,
|
|
427
|
+
owner: owner_option = None,
|
|
428
|
+
id: id_option = None,
|
|
429
|
+
debug: debug_option = None,
|
|
430
|
+
):
|
|
431
|
+
"""Import a data contract from Pydantic models."""
|
|
432
|
+
enable_debug_logging(debug)
|
|
433
|
+
result = DataContract.import_from_source(
|
|
434
|
+
config=cli_config(), format="pydantic-model", source=source, schema=schema, owner=owner, id=id
|
|
435
|
+
)
|
|
436
|
+
_write_result(result, output)
|
|
437
|
+
|
|
438
|
+
|
|
419
439
|
@import_app.command(
|
|
420
440
|
name="spark",
|
|
421
441
|
epilog="Example: datacontract import spark --tables orders,customers --output datacontract.yaml",
|