datacontract-cli 1.0.6__tar.gz → 1.0.8__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.0.6/datacontract_cli.egg-info → datacontract_cli-1.0.8}/PKG-INFO +7 -6
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/cli.py +23 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/connect.py +7 -1
- datacontract_cli-1.0.8/datacontract/engines/ibis/connections/redshift_patch.py +84 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8/datacontract_cli.egg-info}/PKG-INFO +7 -6
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract_cli.egg-info/SOURCES.txt +3 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract_cli.egg-info/requires.txt +6 -7
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/pyproject.toml +7 -6
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_cli.py +33 -0
- datacontract_cli-1.0.8/tests/test_redshift_patch.py +91 -0
- datacontract_cli-1.0.8/tests/test_test_redshift.py +86 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/LICENSE +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/MANIFEST.in +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/README.md +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/api.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/catalog/catalog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/changelog/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/changelog/changelog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/changelog/normalize.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_api.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_catalog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_changelog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_ci.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_dbt.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_edit.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_export.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_import.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_init.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_lint.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_publish.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/command_test.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/data_contract.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/VERSION +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/datacontract-editor.css +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/index.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/java-B260NeH3.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/odcs.svg +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/checks/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/checks/check_spec.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/checks/create_checks.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/checks/type_normalize.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/data_contract_test.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/datacontract/check_azure_blob_file.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/kafka.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/dtype_category.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/ibis_check_execute.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/avro_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/avro_idl_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/bigquery_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/custom_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/data_caterer_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/dbml_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/dbt_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/dcs_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/dqx_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/duckdb_type_converter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/excel_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/exporter_factory.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/go_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/great_expectations_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/html_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/iceberg_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/jsonschema_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/markdown_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/mermaid_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/odcs_export_helper.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/odcs_v3_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/pandas_type_converter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/protobuf_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/pydantic_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/rdf_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/sodacl_check_builder.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/sodacl_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/spark_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/sql_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/sql_type_converter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/export/sqlalchemy_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/avro_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/bigquery_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/csv_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/dbml_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/dbt_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/dcs_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/excel_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/glue_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/iceberg_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/importer_factory.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/json_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/jsonschema_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/odcs_helper.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/odcs_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/parquet_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/powerbi_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/protobuf_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/snowflake_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/spark_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/sql_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/imports/unity_importer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/init/init_template.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/integration/dbt_sync.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/integration/dbt_test_mapping.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/integration/entropy_data.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/lint/files.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/lint/resolve.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/lint/resources.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/lint/schema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/lint/urls.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/model/changelog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/model/exceptions.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/model/odcs.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/model/run.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/model/server.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/__init__.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/ci_output.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/json_test_results.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/junit_test_results.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/output_format.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/test_results_writer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/output/text_changelog_results.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/py.typed +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/datacontract.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/datacontract_odcs.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/index.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/datacontract_information.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/datacontract_terms.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/definition.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/example.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/model_field.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/quality.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/partials/server.html +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/templates/style/output.css +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract_cli.egg-info/dependency_links.txt +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract_cli.egg-info/entry_points.txt +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract_cli.egg-info/top_level.txt +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/setup.cfg +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_api.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_catalog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_changelog.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_changelog_engine.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_changelog_normalize.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_changelog_output_text.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_ci_output.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_connect_databricks.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_connect_sqlserver.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_connect_trino.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_data_contract.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_data_contract_checks.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_data_contract_specification.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_dbt_sync.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_dbt_test_mapping.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_description_linter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_download_datacontract_file.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_duckdb_json.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_edit.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_avro.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_avro_idl.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_bigquery.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_complex_data_contract.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_custom.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_custom_exporter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_custom_model.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_data_caterer.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_dbml.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_dbt_models.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_dbt_sources.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_dbt_staging_sql.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_dqx.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_excel.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_go.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_great_expectations.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_html.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_iceberg.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_jsonschema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_markdown.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_mermaid.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_odcs_v3.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_protobuf.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_pydantic.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_rdf.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_sodacl.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_spark.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_sql.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_sql_clickhouse.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_sql_query.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_export_sqlalchemy.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_ibis_mssql_pattern.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_ibis_oracle_schema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_avro.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_bigquery.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_csv.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_dbml.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_dbt.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_excel.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_glue.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_iceberg.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_json.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_jsonschema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_odcs_v3.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_parquet.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_powerbi.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_protobuf.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_snowflake.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_spark.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_sql_oracle.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_sql_postgres.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_sql_snowflake.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_sql_sqlserver.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_import_unity_file.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_integration_entropydata.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_lint.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_oracle_patch.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_require_env.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_resolve.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_resolve_definitions.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_roundtrip_jsonschema.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_sql_type_converter_physicaltype.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_api.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_athena_iceberg.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_azure_blob_file.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_azure_remote.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_bigquery.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_checks_filter.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_databricks.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_dataframe.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_delta.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_diagnostics.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_failed_samples.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_gcs_csv_remote.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_gcs_json_remote.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_kafka.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_kafka_remote.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_local_json.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_local_json_nd.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_mysql.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_oracle.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_oracle_xe.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_output_json.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_output_junit.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_parquet.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_postgres.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_quality.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_quality_local_fallback.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_quality_percent_severity.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_csv.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_delta.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_json.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_json_complex.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_json_multiple_models.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_s3_json_remote.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_schema_evolution.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_server_not_found.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_snowflake.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_soda_connection_error.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_sqlserver.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/tests/test_test_trino.py +0 -0
- {datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/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.0.
|
|
3
|
+
Version: 1.0.8
|
|
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
|
|
@@ -16,6 +16,7 @@ Requires-Dist: click<9.0.0,>=8.1.0
|
|
|
16
16
|
Requires-Dist: pydantic<2.14.0,>=2.8.2
|
|
17
17
|
Requires-Dist: pyyaml~=6.0.1
|
|
18
18
|
Requires-Dist: requests<2.35,>=2.31
|
|
19
|
+
Requires-Dist: truststore<1.0,>=0.10
|
|
19
20
|
Requires-Dist: fastjsonschema<2.22.0,>=2.19.1
|
|
20
21
|
Requires-Dist: jsonschema<5.0.0,>=4.23.0
|
|
21
22
|
Requires-Dist: pytz>=2024.1
|
|
@@ -40,7 +41,7 @@ Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
|
|
|
40
41
|
Provides-Extra: databricks
|
|
41
42
|
Requires-Dist: ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0; extra == "databricks"
|
|
42
43
|
Requires-Dist: databricks-sql-connector<4.4.0,>=3.7.0; extra == "databricks"
|
|
43
|
-
Requires-Dist: databricks-sdk<0.
|
|
44
|
+
Requires-Dist: databricks-sdk<0.119.0; extra == "databricks"
|
|
44
45
|
Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
|
|
45
46
|
Provides-Extra: iceberg
|
|
46
47
|
Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
|
|
@@ -65,9 +66,9 @@ Requires-Dist: datacontract-cli[duckdb]; extra == "gcs"
|
|
|
65
66
|
Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "gcs"
|
|
66
67
|
Provides-Extra: azure
|
|
67
68
|
Requires-Dist: datacontract-cli[duckdb]; extra == "azure"
|
|
68
|
-
Requires-Dist: duckdb-extension-azure<1.
|
|
69
|
+
Requires-Dist: duckdb-extension-azure<1.6.0,>=1.5.0; extra == "azure"
|
|
69
70
|
Requires-Dist: azure-identity<1.18,>=1.17.1; extra == "azure"
|
|
70
|
-
Requires-Dist: azure-storage-blob<12.
|
|
71
|
+
Requires-Dist: azure-storage-blob<12.31,>=12.24; extra == "azure"
|
|
71
72
|
Provides-Extra: snowflake
|
|
72
73
|
Requires-Dist: snowflake-connector-python[pandas]<4.7,>=3.6; extra == "snowflake"
|
|
73
74
|
Requires-Dist: ibis-framework[snowflake]<13.0.0,>=10.0.0; extra == "snowflake"
|
|
@@ -91,7 +92,7 @@ Requires-Dist: pyarrow>=18.1.0; extra == "parquet"
|
|
|
91
92
|
Provides-Extra: rdf
|
|
92
93
|
Requires-Dist: rdflib==7.6.0; extra == "rdf"
|
|
93
94
|
Provides-Extra: api
|
|
94
|
-
Requires-Dist: fastapi<0.
|
|
95
|
+
Requires-Dist: fastapi<0.139.0,>=0.115.0; extra == "api"
|
|
95
96
|
Requires-Dist: uvicorn<0.50.0,>=0.44.0; extra == "api"
|
|
96
97
|
Provides-Extra: protobuf
|
|
97
98
|
Requires-Dist: proto-schema-parser<3.0,>=1.0; extra == "protobuf"
|
|
@@ -110,7 +111,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
|
110
111
|
Requires-Dist: pymssql==2.3.13; extra == "dev"
|
|
111
112
|
Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
|
|
112
113
|
Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "dev"
|
|
113
|
-
Requires-Dist: ruff==0.15.
|
|
114
|
+
Requires-Dist: ruff==0.15.18; extra == "dev"
|
|
114
115
|
Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2; extra == "dev"
|
|
115
116
|
Requires-Dist: trino==0.337.0; extra == "dev"
|
|
116
117
|
Dynamic: license-file
|
|
@@ -111,6 +111,19 @@ def version_callback(value: bool):
|
|
|
111
111
|
raise typer.Exit()
|
|
112
112
|
|
|
113
113
|
|
|
114
|
+
def inject_system_truststore() -> None:
|
|
115
|
+
"""Verify TLS using the operating system's certificate trust store instead of the
|
|
116
|
+
bundled CA certificates. This lets the CLI work behind corporate proxies or with
|
|
117
|
+
internal CAs whose root certificates are installed in the OS trust store but not in
|
|
118
|
+
the certifi bundle that requests uses by default."""
|
|
119
|
+
try:
|
|
120
|
+
import truststore
|
|
121
|
+
except ImportError:
|
|
122
|
+
console.print("[red]--system-truststore requires the 'truststore' package, which is not installed.[/red]")
|
|
123
|
+
raise typer.Exit(code=1)
|
|
124
|
+
truststore.inject_into_ssl()
|
|
125
|
+
|
|
126
|
+
|
|
114
127
|
@app.callback()
|
|
115
128
|
def common(
|
|
116
129
|
ctx: typer.Context,
|
|
@@ -121,6 +134,13 @@ def common(
|
|
|
121
134
|
callback=version_callback,
|
|
122
135
|
is_eager=True,
|
|
123
136
|
),
|
|
137
|
+
system_truststore: bool = typer.Option(
|
|
138
|
+
False,
|
|
139
|
+
"--system-truststore",
|
|
140
|
+
help="Verify TLS using the operating system's certificate trust store "
|
|
141
|
+
"instead of the bundled CA certificates (e.g. behind a corporate proxy or internal CA).",
|
|
142
|
+
envvar="DATACONTRACT_SYSTEM_TRUSTSTORE",
|
|
143
|
+
),
|
|
124
144
|
):
|
|
125
145
|
"""
|
|
126
146
|
The datacontract CLI is an open source command-line tool for working with Data Contracts (https://datacontract.com).
|
|
@@ -134,6 +154,9 @@ def common(
|
|
|
134
154
|
# Already-set environment variables take precedence.
|
|
135
155
|
load_dotenv(dotenv_path=find_dotenv(usecwd=True), override=False)
|
|
136
156
|
|
|
157
|
+
if system_truststore:
|
|
158
|
+
inject_system_truststore()
|
|
159
|
+
|
|
137
160
|
|
|
138
161
|
def enable_debug_logging(debug: bool, otherwise_disable_stderr: bool = False):
|
|
139
162
|
if not debug and otherwise_disable_stderr:
|
{datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/engines/ibis/connections/connect.py
RENAMED
|
@@ -115,7 +115,13 @@ def connect_ibis(
|
|
|
115
115
|
if password:
|
|
116
116
|
kwargs["password"] = password
|
|
117
117
|
# Redshift speaks the postgres wire protocol; ibis has no dedicated backend.
|
|
118
|
-
|
|
118
|
+
con = ibis.postgres.connect(**kwargs)
|
|
119
|
+
# ibis's postgres schema introspection joins pg_catalog.pg_enum, which
|
|
120
|
+
# Redshift does not expose; patch it out so model lookups don't fail.
|
|
121
|
+
from datacontract.engines.ibis.connections.redshift_patch import apply_redshift_compatibility_patch
|
|
122
|
+
|
|
123
|
+
apply_redshift_compatibility_patch(con)
|
|
124
|
+
return con
|
|
119
125
|
|
|
120
126
|
if server_type == "mysql":
|
|
121
127
|
return _connect_mysql_via_duckdb(ibis, data_contract, server, run, schema_name)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"""Make ibis's Postgres schema introspection valid on Amazon Redshift.
|
|
2
|
+
|
|
3
|
+
Redshift has no dedicated ibis backend; it rides the Postgres backend over the
|
|
4
|
+
Postgres wire protocol (see ``connect.py``). ibis builds the column-metadata
|
|
5
|
+
query behind ``con.table(...)`` (``ibis.backends.postgres.Backend.get_schema``)
|
|
6
|
+
with an enum-detection ``CASE`` that joins ``pg_catalog.pg_enum``:
|
|
7
|
+
|
|
8
|
+
CASE WHEN EXISTS(
|
|
9
|
+
SELECT 1 FROM pg_catalog.pg_type t
|
|
10
|
+
INNER JOIN pg_catalog.pg_enum e ON e.enumtypid = t.oid ...
|
|
11
|
+
) THEN 'enum' ELSE pg_catalog.format_type(...) END
|
|
12
|
+
|
|
13
|
+
PostgreSQL exposes ``pg_catalog.pg_enum``; Redshift does not, so introspecting
|
|
14
|
+
any model fails with:
|
|
15
|
+
|
|
16
|
+
relation "pg_catalog.pg_enum" does not exist
|
|
17
|
+
|
|
18
|
+
Redshift has no enum types, so the ``CASE`` is pointless there. This module
|
|
19
|
+
re-binds ``get_schema`` on a connected backend with the same query minus the
|
|
20
|
+
enum join, reading the column type straight from ``pg_catalog.format_type``.
|
|
21
|
+
``_get_schema_using_query`` (custom-SQL introspection) calls ``self.get_schema``
|
|
22
|
+
internally, so it inherits the fix without a separate override. The patch can be
|
|
23
|
+
removed once a fixed ibis release is available.
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
import logging
|
|
29
|
+
import types
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
# ibis's get_schema query without the pg_enum-dependent enum CASE. Every other
|
|
34
|
+
# relation (pg_attribute / pg_class / pg_namespace) and pg_catalog.format_type
|
|
35
|
+
# is supported by Redshift's leader-node catalog.
|
|
36
|
+
_TYPE_INFO_SQL = """\
|
|
37
|
+
SELECT
|
|
38
|
+
a.attname AS column_name,
|
|
39
|
+
pg_catalog.format_type(a.atttypid, a.atttypmod) AS data_type,
|
|
40
|
+
NOT a.attnotnull AS nullable
|
|
41
|
+
FROM pg_catalog.pg_attribute a
|
|
42
|
+
INNER JOIN pg_catalog.pg_class c
|
|
43
|
+
ON a.attrelid = c.oid
|
|
44
|
+
INNER JOIN pg_catalog.pg_namespace n
|
|
45
|
+
ON c.relnamespace = n.oid
|
|
46
|
+
WHERE a.attnum > 0
|
|
47
|
+
AND NOT a.attisdropped
|
|
48
|
+
AND n.nspname = ANY(%(dbs)s)
|
|
49
|
+
AND c.relname = %(name)s
|
|
50
|
+
ORDER BY a.attnum ASC"""
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def apply_redshift_compatibility_patch(con) -> None:
|
|
54
|
+
"""Re-bind Postgres schema introspection to emit Redshift-compatible SQL.
|
|
55
|
+
|
|
56
|
+
Best-effort: if the backend internals differ from what we expect (e.g. a
|
|
57
|
+
future ibis refactor), the patch is skipped and the original method stays in
|
|
58
|
+
place rather than breaking the connection.
|
|
59
|
+
"""
|
|
60
|
+
try:
|
|
61
|
+
con.get_schema = types.MethodType(_get_schema, con)
|
|
62
|
+
except Exception: # pragma: no cover - defensive, never block a connection
|
|
63
|
+
logger.debug("Could not apply Redshift compatibility patch", exc_info=True)
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def _get_schema(self, name: str, *, catalog=None, database=None):
|
|
67
|
+
"""Drop-in for ``Backend.get_schema`` without the ``pg_enum`` join."""
|
|
68
|
+
import ibis.common.exceptions as com
|
|
69
|
+
import ibis.expr.schema as sch
|
|
70
|
+
|
|
71
|
+
dbs = [database or self.current_database]
|
|
72
|
+
if database is None and (temp_table_db := self._session_temp_db) is not None:
|
|
73
|
+
dbs.append(temp_table_db)
|
|
74
|
+
|
|
75
|
+
type_mapper = self.compiler.type_mapper
|
|
76
|
+
con = self.con
|
|
77
|
+
params = {"dbs": dbs, "name": name}
|
|
78
|
+
with con.cursor() as cursor, con.transaction():
|
|
79
|
+
rows = cursor.execute(_TYPE_INFO_SQL, params, prepare=True).fetchall()
|
|
80
|
+
|
|
81
|
+
if not rows:
|
|
82
|
+
raise com.TableNotFound(name)
|
|
83
|
+
|
|
84
|
+
return sch.Schema({col: type_mapper.from_string(typestr, nullable=nullable) for col, typestr, nullable in rows})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datacontract-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.8
|
|
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
|
|
@@ -16,6 +16,7 @@ Requires-Dist: click<9.0.0,>=8.1.0
|
|
|
16
16
|
Requires-Dist: pydantic<2.14.0,>=2.8.2
|
|
17
17
|
Requires-Dist: pyyaml~=6.0.1
|
|
18
18
|
Requires-Dist: requests<2.35,>=2.31
|
|
19
|
+
Requires-Dist: truststore<1.0,>=0.10
|
|
19
20
|
Requires-Dist: fastjsonschema<2.22.0,>=2.19.1
|
|
20
21
|
Requires-Dist: jsonschema<5.0.0,>=4.23.0
|
|
21
22
|
Requires-Dist: pytz>=2024.1
|
|
@@ -40,7 +41,7 @@ Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
|
|
|
40
41
|
Provides-Extra: databricks
|
|
41
42
|
Requires-Dist: ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0; extra == "databricks"
|
|
42
43
|
Requires-Dist: databricks-sql-connector<4.4.0,>=3.7.0; extra == "databricks"
|
|
43
|
-
Requires-Dist: databricks-sdk<0.
|
|
44
|
+
Requires-Dist: databricks-sdk<0.119.0; extra == "databricks"
|
|
44
45
|
Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
|
|
45
46
|
Provides-Extra: iceberg
|
|
46
47
|
Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
|
|
@@ -65,9 +66,9 @@ Requires-Dist: datacontract-cli[duckdb]; extra == "gcs"
|
|
|
65
66
|
Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "gcs"
|
|
66
67
|
Provides-Extra: azure
|
|
67
68
|
Requires-Dist: datacontract-cli[duckdb]; extra == "azure"
|
|
68
|
-
Requires-Dist: duckdb-extension-azure<1.
|
|
69
|
+
Requires-Dist: duckdb-extension-azure<1.6.0,>=1.5.0; extra == "azure"
|
|
69
70
|
Requires-Dist: azure-identity<1.18,>=1.17.1; extra == "azure"
|
|
70
|
-
Requires-Dist: azure-storage-blob<12.
|
|
71
|
+
Requires-Dist: azure-storage-blob<12.31,>=12.24; extra == "azure"
|
|
71
72
|
Provides-Extra: snowflake
|
|
72
73
|
Requires-Dist: snowflake-connector-python[pandas]<4.7,>=3.6; extra == "snowflake"
|
|
73
74
|
Requires-Dist: ibis-framework[snowflake]<13.0.0,>=10.0.0; extra == "snowflake"
|
|
@@ -91,7 +92,7 @@ Requires-Dist: pyarrow>=18.1.0; extra == "parquet"
|
|
|
91
92
|
Provides-Extra: rdf
|
|
92
93
|
Requires-Dist: rdflib==7.6.0; extra == "rdf"
|
|
93
94
|
Provides-Extra: api
|
|
94
|
-
Requires-Dist: fastapi<0.
|
|
95
|
+
Requires-Dist: fastapi<0.139.0,>=0.115.0; extra == "api"
|
|
95
96
|
Requires-Dist: uvicorn<0.50.0,>=0.44.0; extra == "api"
|
|
96
97
|
Provides-Extra: protobuf
|
|
97
98
|
Requires-Dist: proto-schema-parser<3.0,>=1.0; extra == "protobuf"
|
|
@@ -110,7 +111,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
|
110
111
|
Requires-Dist: pymssql==2.3.13; extra == "dev"
|
|
111
112
|
Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
|
|
112
113
|
Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "dev"
|
|
113
|
-
Requires-Dist: ruff==0.15.
|
|
114
|
+
Requires-Dist: ruff==0.15.18; extra == "dev"
|
|
114
115
|
Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2; extra == "dev"
|
|
115
116
|
Requires-Dist: trino==0.337.0; extra == "dev"
|
|
116
117
|
Dynamic: license-file
|
|
@@ -136,6 +136,7 @@ datacontract/engines/ibis/connections/connect.py
|
|
|
136
136
|
datacontract/engines/ibis/connections/duckdb_connection.py
|
|
137
137
|
datacontract/engines/ibis/connections/kafka.py
|
|
138
138
|
datacontract/engines/ibis/connections/oracle_patch.py
|
|
139
|
+
datacontract/engines/ibis/connections/redshift_patch.py
|
|
139
140
|
datacontract/export/__init__.py
|
|
140
141
|
datacontract/export/avro_exporter.py
|
|
141
142
|
datacontract/export/avro_idl_exporter.py
|
|
@@ -317,6 +318,7 @@ tests/test_import_unity_file.py
|
|
|
317
318
|
tests/test_integration_entropydata.py
|
|
318
319
|
tests/test_lint.py
|
|
319
320
|
tests/test_oracle_patch.py
|
|
321
|
+
tests/test_redshift_patch.py
|
|
320
322
|
tests/test_require_env.py
|
|
321
323
|
tests/test_resolve.py
|
|
322
324
|
tests/test_resolve_definitions.py
|
|
@@ -349,6 +351,7 @@ tests/test_test_postgres.py
|
|
|
349
351
|
tests/test_test_quality.py
|
|
350
352
|
tests/test_test_quality_local_fallback.py
|
|
351
353
|
tests/test_test_quality_percent_severity.py
|
|
354
|
+
tests/test_test_redshift.py
|
|
352
355
|
tests/test_test_s3_csv.py
|
|
353
356
|
tests/test_test_s3_delta.py
|
|
354
357
|
tests/test_test_s3_json.py
|
|
@@ -3,6 +3,7 @@ click<9.0.0,>=8.1.0
|
|
|
3
3
|
pydantic<2.14.0,>=2.8.2
|
|
4
4
|
pyyaml~=6.0.1
|
|
5
5
|
requests<2.35,>=2.31
|
|
6
|
+
truststore<1.0,>=0.10
|
|
6
7
|
fastjsonschema<2.22.0,>=2.19.1
|
|
7
8
|
jsonschema<5.0.0,>=4.23.0
|
|
8
9
|
pytz>=2024.1
|
|
@@ -21,7 +22,7 @@ deepdiff<10.0.0,>=6.0.0
|
|
|
21
22
|
datacontract-cli[api,athena,azure,bigquery,csv,databricks,dbml,duckdb,excel,gcs,iceberg,impala,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,redshift,s3,snowflake,sqlserver,trino]
|
|
22
23
|
|
|
23
24
|
[api]
|
|
24
|
-
fastapi<0.
|
|
25
|
+
fastapi<0.139.0,>=0.115.0
|
|
25
26
|
uvicorn<0.50.0,>=0.44.0
|
|
26
27
|
|
|
27
28
|
[athena]
|
|
@@ -32,11 +33,9 @@ avro==1.12.1
|
|
|
32
33
|
|
|
33
34
|
[azure]
|
|
34
35
|
datacontract-cli[duckdb]
|
|
36
|
+
duckdb-extension-azure<1.6.0,>=1.5.0
|
|
35
37
|
azure-identity<1.18,>=1.17.1
|
|
36
|
-
azure-storage-blob<12.
|
|
37
|
-
|
|
38
|
-
[azure:platform_system != "Linux" or platform_machine != "aarch64"]
|
|
39
|
-
duckdb-extension-azure<1.1.0,>=1.0.3
|
|
38
|
+
azure-storage-blob<12.31,>=12.24
|
|
40
39
|
|
|
41
40
|
[bigquery]
|
|
42
41
|
ibis-framework[bigquery]<13.0.0,>=10.0.0
|
|
@@ -47,7 +46,7 @@ pandas>=2.0.0
|
|
|
47
46
|
[databricks]
|
|
48
47
|
ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0
|
|
49
48
|
databricks-sql-connector<4.4.0,>=3.7.0
|
|
50
|
-
databricks-sdk<0.
|
|
49
|
+
databricks-sdk<0.119.0
|
|
51
50
|
pyspark<5.0.0,>=3.5.0
|
|
52
51
|
|
|
53
52
|
[dbml]
|
|
@@ -66,7 +65,7 @@ pytest-xdist
|
|
|
66
65
|
pymssql==2.3.13
|
|
67
66
|
psycopg2-binary<3.0,>=2.9
|
|
68
67
|
mysql-connector-python<9.7.0,>=8.0.30
|
|
69
|
-
ruff==0.15.
|
|
68
|
+
ruff==0.15.18
|
|
70
69
|
testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2
|
|
71
70
|
trino==0.337.0
|
|
72
71
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "datacontract-cli"
|
|
3
|
-
version = "1.0.
|
|
3
|
+
version = "1.0.8"
|
|
4
4
|
description = "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
|
license = "MIT"
|
|
6
6
|
readme = "README.md"
|
|
@@ -20,6 +20,7 @@ dependencies = [
|
|
|
20
20
|
"pydantic>=2.8.2,<2.14.0",
|
|
21
21
|
"pyyaml~=6.0.1",
|
|
22
22
|
"requests>=2.31,<2.35",
|
|
23
|
+
"truststore>=0.10,<1.0",
|
|
23
24
|
"fastjsonschema>=2.19.1,<2.22.0",
|
|
24
25
|
"jsonschema>=4.23.0,<5.0.0",
|
|
25
26
|
"pytz>=2024.1",
|
|
@@ -57,7 +58,7 @@ excel = [
|
|
|
57
58
|
databricks = [
|
|
58
59
|
"ibis-framework[databricks,pyspark]>=10.0.0,<13.0.0",
|
|
59
60
|
"databricks-sql-connector>=3.7.0,<4.4.0",
|
|
60
|
-
"databricks-sdk<0.
|
|
61
|
+
"databricks-sdk<0.119.0",
|
|
61
62
|
# Not capped to Spark 3.5.x like older builds were: the databricks path uses a
|
|
62
63
|
# caller-provided Spark session (or the databricks SQL connector) and never
|
|
63
64
|
# loads the Kafka/Avro connector jars, so it isn't tied to a Scala/Spark line.
|
|
@@ -117,9 +118,9 @@ gcs = [
|
|
|
117
118
|
|
|
118
119
|
azure = [
|
|
119
120
|
"datacontract-cli[duckdb]",
|
|
120
|
-
|
|
121
|
+
"duckdb-extension-azure>=1.5.0,<1.6.0",
|
|
121
122
|
"azure-identity>=1.17.1,<1.18",
|
|
122
|
-
"azure-storage-blob>=12.24,<12.
|
|
123
|
+
"azure-storage-blob>=12.24,<12.31",
|
|
123
124
|
]
|
|
124
125
|
|
|
125
126
|
snowflake = [
|
|
@@ -168,7 +169,7 @@ rdf = [
|
|
|
168
169
|
]
|
|
169
170
|
|
|
170
171
|
api = [
|
|
171
|
-
"fastapi>=0.115.0,<0.
|
|
172
|
+
"fastapi>=0.115.0,<0.139.0",
|
|
172
173
|
"uvicorn>=0.44.0,<0.50.0",
|
|
173
174
|
]
|
|
174
175
|
|
|
@@ -198,7 +199,7 @@ dev = [
|
|
|
198
199
|
# psycopg v3 and DuckDB's mysql extension respectively).
|
|
199
200
|
"psycopg2-binary>=2.9,<3.0",
|
|
200
201
|
"mysql-connector-python>=8.0.30,<9.7.0",
|
|
201
|
-
"ruff==0.15.
|
|
202
|
+
"ruff==0.15.18",
|
|
202
203
|
"testcontainers[minio,postgres,kafka,mssql,mysql]==4.14.2",
|
|
203
204
|
"trino==0.337.0",
|
|
204
205
|
]
|
|
@@ -73,6 +73,39 @@ def test_env_file_does_not_override_existing_environment_variables(tmp_path, mon
|
|
|
73
73
|
assert os.environ.get("DATACONTRACT_TEST_DOTENV_VAR") == "from-environment"
|
|
74
74
|
|
|
75
75
|
|
|
76
|
+
def test_system_truststore_option_in_help():
|
|
77
|
+
result = runner.invoke(app, ["--help"], env={"COLUMNS": "200"})
|
|
78
|
+
assert result.exit_code == 0
|
|
79
|
+
plain_output = re.sub(r"\x1b\[[0-9;]*m", "", result.stdout)
|
|
80
|
+
assert "--system-truststore" in plain_output
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_system_truststore_flag_injects(monkeypatch):
|
|
84
|
+
calls = []
|
|
85
|
+
monkeypatch.setattr("datacontract.cli.inject_system_truststore", lambda: calls.append(True))
|
|
86
|
+
result = runner.invoke(app, ["--system-truststore", "lint", "unknown.yaml"])
|
|
87
|
+
assert result.exit_code == 1 # file does not exist, but the app callback has run
|
|
88
|
+
assert calls == [True]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_system_truststore_env_var_injects(monkeypatch):
|
|
92
|
+
calls = []
|
|
93
|
+
monkeypatch.setattr("datacontract.cli.inject_system_truststore", lambda: calls.append(True))
|
|
94
|
+
monkeypatch.setenv("DATACONTRACT_SYSTEM_TRUSTSTORE", "1")
|
|
95
|
+
result = runner.invoke(app, ["lint", "unknown.yaml"])
|
|
96
|
+
assert result.exit_code == 1
|
|
97
|
+
assert calls == [True]
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def test_system_truststore_not_injected_by_default(monkeypatch):
|
|
101
|
+
calls = []
|
|
102
|
+
monkeypatch.setattr("datacontract.cli.inject_system_truststore", lambda: calls.append(True))
|
|
103
|
+
monkeypatch.delenv("DATACONTRACT_SYSTEM_TRUSTSTORE", raising=False)
|
|
104
|
+
result = runner.invoke(app, ["lint", "unknown.yaml"])
|
|
105
|
+
assert result.exit_code == 1
|
|
106
|
+
assert calls == []
|
|
107
|
+
|
|
108
|
+
|
|
76
109
|
def test_changelog_help():
|
|
77
110
|
result = runner.invoke(app, ["changelog", "--help"])
|
|
78
111
|
assert result.exit_code == 0
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"""Regression tests for the Redshift Postgres schema-introspection patch.
|
|
2
|
+
|
|
3
|
+
Redshift rides ibis's Postgres backend, whose ``get_schema`` query joins
|
|
4
|
+
``pg_catalog.pg_enum`` to detect enum columns. Redshift does not expose
|
|
5
|
+
``pg_enum``, so the unpatched query fails with ``relation "pg_catalog.pg_enum"
|
|
6
|
+
does not exist``. These tests assert the patched query never references
|
|
7
|
+
``pg_enum`` and still types columns correctly, without needing a live Redshift.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import contextlib
|
|
11
|
+
|
|
12
|
+
import pytest
|
|
13
|
+
|
|
14
|
+
sc = pytest.importorskip("ibis.backends.sql.compilers")
|
|
15
|
+
|
|
16
|
+
from datacontract.engines.ibis.connections import redshift_patch # noqa: E402
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class _StubCursor:
|
|
20
|
+
def __init__(self, rows):
|
|
21
|
+
self._rows = rows
|
|
22
|
+
|
|
23
|
+
def execute(self, sql, params=None, prepare=False):
|
|
24
|
+
self._executed_sql = sql
|
|
25
|
+
return self
|
|
26
|
+
|
|
27
|
+
def fetchall(self):
|
|
28
|
+
return self._rows
|
|
29
|
+
|
|
30
|
+
def __enter__(self):
|
|
31
|
+
return self
|
|
32
|
+
|
|
33
|
+
def __exit__(self, *exc):
|
|
34
|
+
return False
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class _StubPostgresConnection:
|
|
38
|
+
"""Minimal stand-in exposing what the patched introspection method touches."""
|
|
39
|
+
|
|
40
|
+
name = "postgres"
|
|
41
|
+
compiler = sc.postgres.compiler
|
|
42
|
+
current_database = "dev"
|
|
43
|
+
_session_temp_db = None
|
|
44
|
+
|
|
45
|
+
def __init__(self, rows):
|
|
46
|
+
self._cursor = _StubCursor(rows)
|
|
47
|
+
|
|
48
|
+
@property
|
|
49
|
+
def con(self):
|
|
50
|
+
return self
|
|
51
|
+
|
|
52
|
+
def cursor(self):
|
|
53
|
+
return self._cursor
|
|
54
|
+
|
|
55
|
+
@contextlib.contextmanager
|
|
56
|
+
def transaction(self):
|
|
57
|
+
yield
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def test_get_schema_query_omits_pg_enum_and_types_columns():
|
|
61
|
+
rows = [
|
|
62
|
+
("cust_code", "character varying(10)", False),
|
|
63
|
+
("cust_state", "character varying(24)", True),
|
|
64
|
+
]
|
|
65
|
+
con = _StubPostgresConnection(rows)
|
|
66
|
+
|
|
67
|
+
schema = redshift_patch._get_schema(con, "customer", database="dwh_academic")
|
|
68
|
+
|
|
69
|
+
assert "pg_enum" not in con._cursor._executed_sql
|
|
70
|
+
assert schema["cust_code"].is_string()
|
|
71
|
+
assert schema["cust_code"].nullable is False
|
|
72
|
+
assert schema["cust_state"].nullable is True
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def test_get_schema_raises_table_not_found_when_empty():
|
|
76
|
+
import ibis.common.exceptions as com
|
|
77
|
+
|
|
78
|
+
con = _StubPostgresConnection([])
|
|
79
|
+
with pytest.raises(com.TableNotFound):
|
|
80
|
+
redshift_patch._get_schema(con, "missing", database="dwh_academic")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_apply_patch_rebinds_get_schema():
|
|
84
|
+
class _Backend:
|
|
85
|
+
def get_schema(self, *a, **k): # pragma: no cover - replaced by the patch
|
|
86
|
+
return "original"
|
|
87
|
+
|
|
88
|
+
backend = _Backend()
|
|
89
|
+
redshift_patch.apply_redshift_compatibility_patch(backend)
|
|
90
|
+
|
|
91
|
+
assert backend.get_schema.__func__ is redshift_patch._get_schema
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"""Smoke test for the Redshift test path against a Postgres testcontainer.
|
|
2
|
+
|
|
3
|
+
Redshift has no dedicated ibis backend; it rides the Postgres backend over the
|
|
4
|
+
Postgres wire protocol (see ``connect_ibis``), with two compatibility patches on
|
|
5
|
+
top: tables are qualified with the configured ``schema`` (#1338) and the column
|
|
6
|
+
introspection query is rewritten to drop the ``pg_catalog.pg_enum`` join that
|
|
7
|
+
Redshift does not expose (``redshift_patch``).
|
|
8
|
+
|
|
9
|
+
No real Redshift is reachable in CI, so this exercises the full ``type: redshift``
|
|
10
|
+
code path — connect branch, schema-qualified introspection, the pg_enum-free
|
|
11
|
+
``get_schema``, the batched aggregations, a pattern check, and custom SQL quality
|
|
12
|
+
checks — against a wire-compatible Postgres. It proves the redshift branch and
|
|
13
|
+
the patched introspection produce correct schemas and a passing run end-to-end;
|
|
14
|
+
it cannot catch Redshift-only dialect divergences (POSIX regex, temp-view-backed
|
|
15
|
+
``con.sql`` falling back to ``raw_sql``), which need a live cluster.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
import pytest
|
|
19
|
+
from testcontainers.postgres import PostgresContainer
|
|
20
|
+
|
|
21
|
+
from datacontract.data_contract import DataContract
|
|
22
|
+
from datacontract.model.exceptions import DataContractException
|
|
23
|
+
from datacontract.model.run import ResultEnum
|
|
24
|
+
|
|
25
|
+
postgres = PostgresContainer("postgres:16")
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture(scope="function", autouse=True)
|
|
29
|
+
def postgres_container(request):
|
|
30
|
+
postgres.start()
|
|
31
|
+
|
|
32
|
+
def remove_container():
|
|
33
|
+
postgres.stop()
|
|
34
|
+
|
|
35
|
+
request.addfinalizer(remove_container)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_test_redshift_path_via_postgres_wire(postgres_container, monkeypatch):
|
|
39
|
+
monkeypatch.setenv("DATACONTRACT_REDSHIFT_USERNAME", postgres.username)
|
|
40
|
+
monkeypatch.setenv("DATACONTRACT_REDSHIFT_PASSWORD", postgres.password)
|
|
41
|
+
_init_sql("fixtures/postgres/data/data.sql")
|
|
42
|
+
|
|
43
|
+
data_contract_str = _setup_datacontract("fixtures/redshift/odcs.yaml")
|
|
44
|
+
data_contract = DataContract(data_contract_str=data_contract_str)
|
|
45
|
+
|
|
46
|
+
run = data_contract.test()
|
|
47
|
+
|
|
48
|
+
print(run.pretty())
|
|
49
|
+
assert run.result == "passed"
|
|
50
|
+
assert all(check.result == ResultEnum.passed for check in run.checks)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _setup_datacontract(file):
|
|
54
|
+
with open(file) as data_contract_file:
|
|
55
|
+
data_contract_str = data_contract_file.read()
|
|
56
|
+
port = postgres.get_exposed_port(5432)
|
|
57
|
+
# The fixture uses the default Redshift port 5439 as a placeholder.
|
|
58
|
+
return data_contract_str.replace("5439", str(port))
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _init_sql(file_path):
|
|
62
|
+
try:
|
|
63
|
+
import psycopg2
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
raise DataContractException(
|
|
66
|
+
type="schema",
|
|
67
|
+
result="failed",
|
|
68
|
+
name="postgres extra missing",
|
|
69
|
+
reason="Install the extra datacontract-cli[postgres] to use postgres",
|
|
70
|
+
engine="datacontract",
|
|
71
|
+
original_exception=e,
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
connection = psycopg2.connect(
|
|
75
|
+
database=postgres.dbname,
|
|
76
|
+
user=postgres.username,
|
|
77
|
+
password=postgres.password,
|
|
78
|
+
host=postgres.get_container_host_ip(),
|
|
79
|
+
port=postgres.get_exposed_port(5432),
|
|
80
|
+
)
|
|
81
|
+
cursor = connection.cursor()
|
|
82
|
+
with open(file_path, "r") as sql_file:
|
|
83
|
+
cursor.execute(sql_file.read())
|
|
84
|
+
connection.commit()
|
|
85
|
+
cursor.close()
|
|
86
|
+
connection.close()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/abap-Bs8kvjsq.js
RENAMED
|
File without changes
|
{datacontract_cli-1.0.6 → datacontract_cli-1.0.8}/datacontract/editor_assets/apex-Dspwrl5m.js
RENAMED
|
File without changes
|
|
File without changes
|