datacontract-cli 1.0.1__tar.gz → 1.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {datacontract_cli-1.0.1/datacontract_cli.egg-info → datacontract_cli-1.0.3}/PKG-INFO +33 -7
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/README.md +24 -1
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_edit.py +73 -8
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_import.py +20 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/connect.py +20 -2
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/ibis_check_execute.py +35 -4
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/importer.py +1 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/importer_factory.py +5 -1
- datacontract_cli-1.0.3/datacontract/imports/powerbi_importer.py +470 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3/datacontract_cli.egg-info}/PKG-INFO +33 -7
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/SOURCES.txt +3 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/requires.txt +8 -5
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/pyproject.toml +15 -8
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_edit.py +77 -1
- datacontract_cli-1.0.3/tests/test_import_powerbi.py +479 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_dataframe.py +26 -0
- datacontract_cli-1.0.3/tests/test_test_quality_local_fallback.py +13 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/LICENSE +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/MANIFEST.in +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/api.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/catalog/catalog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/changelog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/normalize.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/cli.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_api.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_catalog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_changelog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_ci.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_dbt.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_export.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_init.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_lint.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_publish.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_test.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/data_contract.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/VERSION +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/datacontract-editor.css +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/index.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/java-B260NeH3.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/odcs.svg +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/check_spec.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/create_checks.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/type_normalize.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/data_contract_test.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/kafka.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/dtype_category.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/avro_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/avro_idl_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/bigquery_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/custom_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/data_caterer_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dbml_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dbt_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dcs_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dqx_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/duckdb_type_converter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/excel_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/exporter_factory.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/go_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/great_expectations_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/html_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/iceberg_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/jsonschema_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/markdown_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/mermaid_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/odcs_export_helper.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/odcs_v3_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/pandas_type_converter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/protobuf_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/pydantic_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/rdf_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sodacl_check_builder.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sodacl_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/spark_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sql_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sql_type_converter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sqlalchemy_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/avro_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/bigquery_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/csv_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dbml_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dbt_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dcs_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/excel_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/glue_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/iceberg_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/json_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/jsonschema_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/odcs_helper.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/odcs_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/parquet_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/protobuf_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/snowflake_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/spark_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/sql_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/unity_importer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/init/init_template.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/dbt_sync.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/dbt_test_mapping.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/entropy_data.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/files.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/resolve.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/resources.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/schema.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/urls.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/changelog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/exceptions.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/odcs.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/run.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/server.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/__init__.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/ci_output.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/json_test_results.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/junit_test_results.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/output_format.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/test_results_writer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/text_changelog_results.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/py.typed +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/datacontract.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/datacontract_odcs.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/index.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_information.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_terms.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/definition.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/example.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/model_field.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/quality.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/server.html +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/style/output.css +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/dependency_links.txt +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/entry_points.txt +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/top_level.txt +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/setup.cfg +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_api.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_catalog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_engine.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_normalize.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_output_text.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_ci_output.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_cli.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_connect_databricks.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_connect_sqlserver.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract_checks.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract_specification.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_dbt_sync.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_dbt_test_mapping.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_description_linter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_download_datacontract_file.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_duckdb_json.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_avro.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_avro_idl.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_bigquery.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_complex_data_contract.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom_exporter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom_model.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_data_caterer.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbml.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_models.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_sources.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_staging_sql.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dqx.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_excel.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_go.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_great_expectations.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_html.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_iceberg.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_jsonschema.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_markdown.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_mermaid.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_odcs_v3.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_protobuf.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_pydantic.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_rdf.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sodacl.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_spark.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sql.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sql_query.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sqlalchemy.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_ibis_mssql_pattern.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_avro.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_bigquery.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_csv.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_dbml.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_dbt.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_excel.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_glue.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_iceberg.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_json.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_jsonschema.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_odcs_v3.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_parquet.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_protobuf.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_snowflake.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_spark.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_oracle.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_postgres.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_snowflake.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_sqlserver.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_unity_file.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_integration_entropydata.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_lint.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_require_env.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_resolve.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_resolve_definitions.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_roundtrip_jsonschema.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_sql_type_converter_physicaltype.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_api.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_athena_iceberg.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_azure_remote.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_bigquery.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_checks_filter.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_databricks.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_delta.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_diagnostics.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_failed_samples.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_gcs_csv_remote.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_gcs_json_remote.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_kafka.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_kafka_remote.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_local_json.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_local_json_nd.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_mysql.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_oracle.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_output_json.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_output_junit.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_parquet.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_postgres.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_quality.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_quality_percent_severity.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_csv.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_delta.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_complex.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_multiple_models.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_remote.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_schema_evolution.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_server_not_found.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_snowflake.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_soda_connection_error.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_sqlserver.py +0 -0
- {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_trino.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datacontract-cli
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.3
|
|
4
4
|
Summary: The datacontract CLI is an open source command-line tool for working with Data Contracts. It uses data contract YAML files to lint the data contract, connect to data sources and execute schema and quality tests, detect breaking changes, and export to different formats. The tool is written in Python. It can be used as a standalone CLI tool, in a CI/CD pipeline, or directly as a Python library.
|
|
5
5
|
Author-email: Jochen Christ <jochen.christ@innoq.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@innoq.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -11,7 +11,8 @@ Classifier: Operating System :: OS Independent
|
|
|
11
11
|
Requires-Python: <3.15,>=3.10
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
13
13
|
License-File: LICENSE
|
|
14
|
-
Requires-Dist: typer<0.
|
|
14
|
+
Requires-Dist: typer<0.27,>=0.18.0
|
|
15
|
+
Requires-Dist: click<9.0.0,>=8.1.0
|
|
15
16
|
Requires-Dist: pydantic<2.14.0,>=2.8.2
|
|
16
17
|
Requires-Dist: pyyaml~=6.0.1
|
|
17
18
|
Requires-Dist: requests<2.35,>=2.31
|
|
@@ -38,8 +39,8 @@ Provides-Extra: excel
|
|
|
38
39
|
Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
|
|
39
40
|
Provides-Extra: databricks
|
|
40
41
|
Requires-Dist: ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0; extra == "databricks"
|
|
41
|
-
Requires-Dist: databricks-sql-connector<4.
|
|
42
|
-
Requires-Dist: databricks-sdk<0.
|
|
42
|
+
Requires-Dist: databricks-sql-connector<4.4.0,>=3.7.0; extra == "databricks"
|
|
43
|
+
Requires-Dist: databricks-sdk<0.118.0; extra == "databricks"
|
|
43
44
|
Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
|
|
44
45
|
Provides-Extra: iceberg
|
|
45
46
|
Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
|
|
@@ -51,8 +52,10 @@ Provides-Extra: mysql
|
|
|
51
52
|
Requires-Dist: datacontract-cli[duckdb]; extra == "mysql"
|
|
52
53
|
Provides-Extra: postgres
|
|
53
54
|
Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "postgres"
|
|
55
|
+
Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "postgres"
|
|
54
56
|
Provides-Extra: redshift
|
|
55
57
|
Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "redshift"
|
|
58
|
+
Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "redshift"
|
|
56
59
|
Provides-Extra: s3
|
|
57
60
|
Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
|
|
58
61
|
Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "s3"
|
|
@@ -86,7 +89,7 @@ Requires-Dist: pyarrow>=18.1.0; extra == "parquet"
|
|
|
86
89
|
Provides-Extra: rdf
|
|
87
90
|
Requires-Dist: rdflib==7.6.0; extra == "rdf"
|
|
88
91
|
Provides-Extra: api
|
|
89
|
-
Requires-Dist: fastapi<0.
|
|
92
|
+
Requires-Dist: fastapi<0.138.0,>=0.115.0; extra == "api"
|
|
90
93
|
Requires-Dist: uvicorn<0.50.0,>=0.44.0; extra == "api"
|
|
91
94
|
Provides-Extra: protobuf
|
|
92
95
|
Requires-Dist: proto-schema-parser<3.0,>=1.0; extra == "protobuf"
|
|
@@ -105,7 +108,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
|
|
|
105
108
|
Requires-Dist: pymssql==2.3.13; extra == "dev"
|
|
106
109
|
Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
|
|
107
110
|
Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "dev"
|
|
108
|
-
Requires-Dist: ruff==0.15.
|
|
111
|
+
Requires-Dist: ruff==0.15.17; extra == "dev"
|
|
109
112
|
Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2; extra == "dev"
|
|
110
113
|
Requires-Dist: trino==0.337.0; extra == "dev"
|
|
111
114
|
Dynamic: license-file
|
|
@@ -430,6 +433,7 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
|
|
|
430
433
|
Starts a local web server that opens the Data Contract Editor for the given file.
|
|
431
434
|
The editor is bundled with the CLI, so no internet access is required.
|
|
432
435
|
Saving in the editor writes directly back to the local file.
|
|
436
|
+
If a URL is given, you are asked whether to download a local copy, which is then edited.
|
|
433
437
|
The server also acts as the editor's test runner: "Run test" in the editor executes
|
|
434
438
|
the data contract tests locally against the servers defined in the data contract.
|
|
435
439
|
Credentials for the data sources must be provided as environment variables, see
|
|
@@ -437,7 +441,9 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
|
|
|
437
441
|
|
|
438
442
|
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
|
|
439
443
|
│ location [LOCATION] The path of the data contract yaml to edit. If the file does not │
|
|
440
|
-
│ exist, you are asked whether to initialize a new data contract.
|
|
444
|
+
│ exist, you are asked whether to initialize a new data contract. If a │
|
|
445
|
+
│ URL is given, you are asked whether to download a local copy to │
|
|
446
|
+
│ edit. │
|
|
441
447
|
│ [default: datacontract.yaml] │
|
|
442
448
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
|
|
443
449
|
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
|
|
@@ -791,6 +797,7 @@ models:
|
|
|
791
797
|
|----------------------------------------------|---------------------------|---------------------------------------------------------|
|
|
792
798
|
| `DATACONTRACT_BIGQUERY_ACCOUNT_INFO_JSON_PATH` | `~/service-access-key.json` | Service Account key JSON file. If not set, ADC/WIF is used automatically. |
|
|
793
799
|
| `DATACONTRACT_BIGQUERY_IMPERSONATION_ACCOUNT` | `sa@project.iam.gserviceaccount.com` | Optional. Service account to impersonate. Works with both key file and ADC auth. |
|
|
800
|
+
| `DATACONTRACT_BIGQUERY_BILLING_PROJECT` | `my-compute-project` | Optional. Google Cloud project ID to bill query jobs to. Use when the data lives in an external project and you want charges routed to your own project. Requires `bigquery.jobUser` on the billing project and `bigquery.dataViewer` on the data project. |
|
|
794
801
|
|
|
795
802
|
</details>
|
|
796
803
|
|
|
@@ -2011,6 +2018,7 @@ Usage: datacontract import [OPTIONS] COMMAND [ARGS]...
|
|
|
2011
2018
|
│ spark Import a data contract from a Spark schema. │
|
|
2012
2019
|
│ iceberg Import a data contract from an Iceberg schema. │
|
|
2013
2020
|
│ excel Import a data contract from an Excel file. │
|
|
2021
|
+
│ powerbi Import a data contract from a Power BI semantic model (.pbit, .bim, or .json) file. │
|
|
2014
2022
|
│ snowflake Import a data contract from a Snowflake workspace. │
|
|
2015
2023
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
|
|
2016
2024
|
|
|
@@ -2256,6 +2264,24 @@ datacontract import snowflake --source account.canada-central.azure --database d
|
|
|
2256
2264
|
```
|
|
2257
2265
|
</details>
|
|
2258
2266
|
|
|
2267
|
+
<details markdown="1">
|
|
2268
|
+
<summary><strong>Power BI</strong></summary>
|
|
2269
|
+
|
|
2270
|
+
Imports a data contract from a Power BI semantic model. Pass the file via the `source` parameter — a `.pbit` template, a `.bim`, or a `.json` (BIM/TMSL) file. Only the semantic model (tables, columns, measures, and hierarchies) is imported; report pages and visuals are not.
|
|
2271
|
+
|
|
2272
|
+
See the [Power BI documentation](https://learn.microsoft.com/en-us/power-bi/create-reports/desktop-templates) for how to export a `.pbit` file from a `.pbix` file.
|
|
2273
|
+
|
|
2274
|
+
Example:
|
|
2275
|
+
|
|
2276
|
+
```bash
|
|
2277
|
+
datacontract import powerbi --source "test.pbit"
|
|
2278
|
+
|
|
2279
|
+
datacontract import powerbi --source "test.bim"
|
|
2280
|
+
```
|
|
2281
|
+
|
|
2282
|
+
</details>
|
|
2283
|
+
|
|
2284
|
+
|
|
2259
2285
|
### catalog
|
|
2260
2286
|
```
|
|
2261
2287
|
Usage: datacontract catalog [OPTIONS]
|
|
@@ -318,6 +318,7 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
|
|
|
318
318
|
Starts a local web server that opens the Data Contract Editor for the given file.
|
|
319
319
|
The editor is bundled with the CLI, so no internet access is required.
|
|
320
320
|
Saving in the editor writes directly back to the local file.
|
|
321
|
+
If a URL is given, you are asked whether to download a local copy, which is then edited.
|
|
321
322
|
The server also acts as the editor's test runner: "Run test" in the editor executes
|
|
322
323
|
the data contract tests locally against the servers defined in the data contract.
|
|
323
324
|
Credentials for the data sources must be provided as environment variables, see
|
|
@@ -325,7 +326,9 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
|
|
|
325
326
|
|
|
326
327
|
╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
|
|
327
328
|
│ location [LOCATION] The path of the data contract yaml to edit. If the file does not │
|
|
328
|
-
│ exist, you are asked whether to initialize a new data contract.
|
|
329
|
+
│ exist, you are asked whether to initialize a new data contract. If a │
|
|
330
|
+
│ URL is given, you are asked whether to download a local copy to │
|
|
331
|
+
│ edit. │
|
|
329
332
|
│ [default: datacontract.yaml] │
|
|
330
333
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
|
|
331
334
|
╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
|
|
@@ -679,6 +682,7 @@ models:
|
|
|
679
682
|
|----------------------------------------------|---------------------------|---------------------------------------------------------|
|
|
680
683
|
| `DATACONTRACT_BIGQUERY_ACCOUNT_INFO_JSON_PATH` | `~/service-access-key.json` | Service Account key JSON file. If not set, ADC/WIF is used automatically. |
|
|
681
684
|
| `DATACONTRACT_BIGQUERY_IMPERSONATION_ACCOUNT` | `sa@project.iam.gserviceaccount.com` | Optional. Service account to impersonate. Works with both key file and ADC auth. |
|
|
685
|
+
| `DATACONTRACT_BIGQUERY_BILLING_PROJECT` | `my-compute-project` | Optional. Google Cloud project ID to bill query jobs to. Use when the data lives in an external project and you want charges routed to your own project. Requires `bigquery.jobUser` on the billing project and `bigquery.dataViewer` on the data project. |
|
|
682
686
|
|
|
683
687
|
</details>
|
|
684
688
|
|
|
@@ -1899,6 +1903,7 @@ Usage: datacontract import [OPTIONS] COMMAND [ARGS]...
|
|
|
1899
1903
|
│ spark Import a data contract from a Spark schema. │
|
|
1900
1904
|
│ iceberg Import a data contract from an Iceberg schema. │
|
|
1901
1905
|
│ excel Import a data contract from an Excel file. │
|
|
1906
|
+
│ powerbi Import a data contract from a Power BI semantic model (.pbit, .bim, or .json) file. │
|
|
1902
1907
|
│ snowflake Import a data contract from a Snowflake workspace. │
|
|
1903
1908
|
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
|
|
1904
1909
|
|
|
@@ -2144,6 +2149,24 @@ datacontract import snowflake --source account.canada-central.azure --database d
|
|
|
2144
2149
|
```
|
|
2145
2150
|
</details>
|
|
2146
2151
|
|
|
2152
|
+
<details markdown="1">
|
|
2153
|
+
<summary><strong>Power BI</strong></summary>
|
|
2154
|
+
|
|
2155
|
+
Imports a data contract from a Power BI semantic model. Pass the file via the `source` parameter — a `.pbit` template, a `.bim`, or a `.json` (BIM/TMSL) file. Only the semantic model (tables, columns, measures, and hierarchies) is imported; report pages and visuals are not.
|
|
2156
|
+
|
|
2157
|
+
See the [Power BI documentation](https://learn.microsoft.com/en-us/power-bi/create-reports/desktop-templates) for how to export a `.pbit` file from a `.pbix` file.
|
|
2158
|
+
|
|
2159
|
+
Example:
|
|
2160
|
+
|
|
2161
|
+
```bash
|
|
2162
|
+
datacontract import powerbi --source "test.pbit"
|
|
2163
|
+
|
|
2164
|
+
datacontract import powerbi --source "test.bim"
|
|
2165
|
+
```
|
|
2166
|
+
|
|
2167
|
+
</details>
|
|
2168
|
+
|
|
2169
|
+
|
|
2147
2170
|
### catalog
|
|
2148
2171
|
```
|
|
2149
2172
|
Usage: datacontract catalog [OPTIONS]
|
|
@@ -3,14 +3,16 @@ import mimetypes
|
|
|
3
3
|
import os
|
|
4
4
|
import webbrowser
|
|
5
5
|
from importlib import metadata
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from urllib.parse import quote
|
|
6
|
+
from pathlib import Path, PurePosixPath
|
|
7
|
+
from urllib.parse import quote, unquote, urlparse
|
|
8
8
|
|
|
9
9
|
import typer
|
|
10
10
|
from typing_extensions import Annotated
|
|
11
11
|
|
|
12
12
|
from datacontract.cli import app, console, debug_option, enable_debug_logging
|
|
13
13
|
from datacontract.init.init_template import get_init_template
|
|
14
|
+
from datacontract.lint.urls import fetch_resource
|
|
15
|
+
from datacontract.model.exceptions import DataContractException
|
|
14
16
|
|
|
15
17
|
EDITOR_ASSETS_URL_TEMPLATE = "https://cdn.jsdelivr.net/npm/datacontract-editor@{version}/dist"
|
|
16
18
|
|
|
@@ -34,6 +36,36 @@ def resolve_editor_assets_url(editor_version: str | None, editor_assets_url: str
|
|
|
34
36
|
return None
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
def local_copy_filename(url: str) -> str:
|
|
40
|
+
"""Return the filename for the local copy of a remote data contract URL."""
|
|
41
|
+
name = PurePosixPath(unquote(urlparse(url).path)).name
|
|
42
|
+
if name.endswith((".yaml", ".yml")):
|
|
43
|
+
return name
|
|
44
|
+
return "datacontract.yaml"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _download_local_copy(url: str) -> str:
|
|
48
|
+
"""Ask the user to download a local copy of the remote data contract and return its path."""
|
|
49
|
+
local_filename = local_copy_filename(url)
|
|
50
|
+
console.print("The editor edits local files only, but the data contract is available via a URL.")
|
|
51
|
+
if not typer.confirm(f"Download a local copy to '{local_filename}' and edit that?"):
|
|
52
|
+
console.print("Aborted.")
|
|
53
|
+
raise typer.Exit(code=1)
|
|
54
|
+
local_path = Path(local_filename)
|
|
55
|
+
if local_path.exists() and not typer.confirm(f"File '{local_filename}' already exists. Overwrite it?"):
|
|
56
|
+
console.print("Aborted.")
|
|
57
|
+
raise typer.Exit(code=1)
|
|
58
|
+
try:
|
|
59
|
+
content = fetch_resource(url)
|
|
60
|
+
except DataContractException as e:
|
|
61
|
+
console.print(f"[red]Error: {e.reason}[/red]")
|
|
62
|
+
raise typer.Exit(code=1)
|
|
63
|
+
local_path.write_text(content, encoding="utf-8")
|
|
64
|
+
console.print(f"📄 Downloaded {url} to {local_filename}")
|
|
65
|
+
console.print("Note: Saving in the editor writes to the local copy only, not back to the URL.")
|
|
66
|
+
return local_filename
|
|
67
|
+
|
|
68
|
+
|
|
37
69
|
def _cli_version() -> str:
|
|
38
70
|
try:
|
|
39
71
|
return metadata.version("datacontract-cli")
|
|
@@ -43,9 +75,12 @@ def _cli_version() -> str:
|
|
|
43
75
|
|
|
44
76
|
def _generate_index_html(filename: str) -> str:
|
|
45
77
|
"""
|
|
46
|
-
Generate the editor page
|
|
47
|
-
|
|
48
|
-
|
|
78
|
+
Generate the editor page: load the YAML from the local file API, write it back on
|
|
79
|
+
save, and point the editor's test runner at this server's own /test endpoint.
|
|
80
|
+
|
|
81
|
+
The editor runs in EMBEDDED mode, since the file menu (New, Load Example, Open)
|
|
82
|
+
makes no sense when the editor is bound to a single local file. The filename is
|
|
83
|
+
shown in the header via titlePrefix, and Cancel reverts to the file on disk.
|
|
49
84
|
"""
|
|
50
85
|
filename_js = json.dumps(filename)
|
|
51
86
|
file_api_path = f"/api/files/{quote(filename)}"
|
|
@@ -65,7 +100,7 @@ def _generate_index_html(filename: str) -> str:
|
|
|
65
100
|
<body>
|
|
66
101
|
<div id="root"></div>
|
|
67
102
|
<script type="module">
|
|
68
|
-
import {{ init }} from '{EDITOR_ASSETS_PATH}/datacontract-editor.es.js';
|
|
103
|
+
import {{ init, parseYaml }} from '{EDITOR_ASSETS_PATH}/datacontract-editor.es.js';
|
|
69
104
|
|
|
70
105
|
async function initCli() {{
|
|
71
106
|
try {{
|
|
@@ -77,9 +112,22 @@ def _generate_index_html(filename: str) -> str:
|
|
|
77
112
|
|
|
78
113
|
const notify = (notification) => editor?.getStore().getState().addNotification(notification);
|
|
79
114
|
|
|
115
|
+
// The header renders the titlePrefix followed by the contract's name,
|
|
116
|
+
// so only show the filename when the contract has a name.
|
|
117
|
+
let titlePrefix = null;
|
|
118
|
+
try {{
|
|
119
|
+
if (parseYaml(yaml)?.name) {{
|
|
120
|
+
titlePrefix = {filename_js};
|
|
121
|
+
}}
|
|
122
|
+
}} catch {{
|
|
123
|
+
// not parseable: no contract name to show the filename next to
|
|
124
|
+
}}
|
|
125
|
+
|
|
80
126
|
const editor = init({{
|
|
81
127
|
container: '#root',
|
|
82
|
-
mode: '
|
|
128
|
+
mode: 'EMBEDDED',
|
|
129
|
+
showDelete: false,
|
|
130
|
+
titlePrefix: titlePrefix,
|
|
83
131
|
yaml: yaml,
|
|
84
132
|
persistence: 'none',
|
|
85
133
|
initialView: 'form',
|
|
@@ -87,6 +135,18 @@ def _generate_index_html(filename: str) -> str:
|
|
|
87
135
|
enabled: true,
|
|
88
136
|
dataContractCliApiServerUrl: window.location.origin,
|
|
89
137
|
}},
|
|
138
|
+
onCancel: async () => {{
|
|
139
|
+
try {{
|
|
140
|
+
const response = await fetch('{file_api_path}');
|
|
141
|
+
if (!response.ok) {{
|
|
142
|
+
throw new Error(response.statusText);
|
|
143
|
+
}}
|
|
144
|
+
editor.setYaml(await response.text());
|
|
145
|
+
notify({{ type: 'info', message: 'Discarded changes, reloaded ' + {filename_js} }});
|
|
146
|
+
}} catch (error) {{
|
|
147
|
+
notify({{ type: 'error', message: 'Failed to reload ' + {filename_js} + ': ' + error.message, duration: 5000 }});
|
|
148
|
+
}}
|
|
149
|
+
}},
|
|
90
150
|
onSave: async (yamlContent) => {{
|
|
91
151
|
try {{
|
|
92
152
|
const saveResponse = await fetch('{file_api_path}', {{
|
|
@@ -238,7 +298,8 @@ def edit(
|
|
|
238
298
|
str,
|
|
239
299
|
typer.Argument(
|
|
240
300
|
help="The path of the data contract yaml to edit. "
|
|
241
|
-
"If the file does not exist, you are asked whether to initialize a new data contract."
|
|
301
|
+
"If the file does not exist, you are asked whether to initialize a new data contract. "
|
|
302
|
+
"If a URL is given, you are asked whether to download a local copy to edit."
|
|
242
303
|
),
|
|
243
304
|
] = "datacontract.yaml",
|
|
244
305
|
port: Annotated[int, typer.Option(help="Bind socket to this port.")] = 4243,
|
|
@@ -270,6 +331,7 @@ def edit(
|
|
|
270
331
|
Starts a local web server that opens the Data Contract Editor for the given file.
|
|
271
332
|
The editor is bundled with the CLI, so no internet access is required.
|
|
272
333
|
Saving in the editor writes directly back to the local file.
|
|
334
|
+
If a URL is given, you are asked whether to download a local copy, which is then edited.
|
|
273
335
|
The server also acts as the editor's test runner: "Run test" in the editor executes
|
|
274
336
|
the data contract tests locally against the servers defined in the data contract.
|
|
275
337
|
Credentials for the data sources must be provided as environment variables, see
|
|
@@ -283,6 +345,9 @@ def edit(
|
|
|
283
345
|
console.print("[red]Install the extra datacontract-cli\\[api] to use edit.[/red]")
|
|
284
346
|
raise typer.Exit(code=1)
|
|
285
347
|
|
|
348
|
+
if location.startswith("http://") or location.startswith("https://"):
|
|
349
|
+
location = _download_local_copy(location)
|
|
350
|
+
|
|
286
351
|
file_path = Path(location).resolve()
|
|
287
352
|
if file_path.suffix not in (".yaml", ".yml"):
|
|
288
353
|
console.print("[red]Error: File must be a YAML file (.yaml or .yml).[/red]")
|
|
@@ -431,6 +431,26 @@ def import_excel(
|
|
|
431
431
|
_write_result(result, output)
|
|
432
432
|
|
|
433
433
|
|
|
434
|
+
@import_app.command(
|
|
435
|
+
name="powerbi",
|
|
436
|
+
epilog="Example: datacontract import powerbi --source SemanticModel.pbit --output datacontract.yaml",
|
|
437
|
+
)
|
|
438
|
+
def import_powerbi(
|
|
439
|
+
source: Annotated[
|
|
440
|
+
Optional[str], typer.Option(help="Path to a Power BI .pbit, .bim, or .json semantic model file.")
|
|
441
|
+
] = None,
|
|
442
|
+
output: output_option = None,
|
|
443
|
+
schema: schema_option = None,
|
|
444
|
+
owner: owner_option = None,
|
|
445
|
+
id: id_option = None,
|
|
446
|
+
debug: debug_option = None,
|
|
447
|
+
):
|
|
448
|
+
"""Import a data contract from a Power BI semantic model (.pbit, .bim, or .json) file."""
|
|
449
|
+
enable_debug_logging(debug)
|
|
450
|
+
result = DataContract.import_from_source(format="powerbi", source=source, schema=schema, owner=owner, id=id)
|
|
451
|
+
_write_result(result, output)
|
|
452
|
+
|
|
453
|
+
|
|
434
454
|
@import_app.command(
|
|
435
455
|
name="snowflake",
|
|
436
456
|
epilog="Example: datacontract import snowflake --source account --database DEMO_DB --schema PUBLIC --output datacontract.yaml",
|
{datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/connect.py
RENAMED
|
@@ -142,12 +142,28 @@ def connect_ibis(
|
|
|
142
142
|
)
|
|
143
143
|
|
|
144
144
|
if server_type == "bigquery":
|
|
145
|
-
kwargs = dict(project_id=server.project, dataset_id=server.dataset)
|
|
146
145
|
credentials_path = os.getenv("DATACONTRACT_BIGQUERY_ACCOUNT_INFO_JSON_PATH")
|
|
146
|
+
credentials = None
|
|
147
147
|
if credentials_path:
|
|
148
148
|
from google.oauth2 import service_account
|
|
149
149
|
|
|
150
|
-
|
|
150
|
+
credentials = service_account.Credentials.from_service_account_file(credentials_path)
|
|
151
|
+
|
|
152
|
+
billing_project = os.getenv("DATACONTRACT_BIGQUERY_BILLING_PROJECT")
|
|
153
|
+
|
|
154
|
+
if billing_project and billing_project != server.project:
|
|
155
|
+
from google.cloud import bigquery as bq_client_lib
|
|
156
|
+
|
|
157
|
+
client = bq_client_lib.Client(project=billing_project, credentials=credentials)
|
|
158
|
+
return ibis.bigquery.connect(
|
|
159
|
+
project_id=server.project,
|
|
160
|
+
dataset_id=server.dataset,
|
|
161
|
+
client=client,
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
kwargs = dict(project_id=server.project, dataset_id=server.dataset)
|
|
165
|
+
if credentials:
|
|
166
|
+
kwargs["credentials"] = credentials
|
|
151
167
|
return ibis.bigquery.connect(**kwargs)
|
|
152
168
|
|
|
153
169
|
if server_type == "sqlserver":
|
|
@@ -412,6 +428,7 @@ def _sqlserver_connection_kwargs(server: Server) -> dict:
|
|
|
412
428
|
def _connect_athena(ibis, server: Server):
|
|
413
429
|
s3_access_key_id = os.getenv("DATACONTRACT_S3_ACCESS_KEY_ID")
|
|
414
430
|
s3_secret_access_key = os.getenv("DATACONTRACT_S3_SECRET_ACCESS_KEY")
|
|
431
|
+
s3_session_token = os.getenv("DATACONTRACT_S3_SESSION_TOKEN")
|
|
415
432
|
if not server.schema_:
|
|
416
433
|
raise DataContractException(
|
|
417
434
|
type="athena-connection",
|
|
@@ -430,6 +447,7 @@ def _connect_athena(ibis, server: Server):
|
|
|
430
447
|
s3_staging_dir=server.stagingDir,
|
|
431
448
|
aws_access_key_id=s3_access_key_id,
|
|
432
449
|
aws_secret_access_key=s3_secret_access_key,
|
|
450
|
+
aws_session_token=s3_session_token,
|
|
433
451
|
region_name=os.getenv("DATACONTRACT_S3_REGION") or getattr(server, "region_name", None),
|
|
434
452
|
schema_name=server.schema_,
|
|
435
453
|
)
|
{datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/ibis_check_execute.py
RENAMED
|
@@ -695,10 +695,13 @@ def _run_scalar(con, query: str, dialect: Optional[str]):
|
|
|
695
695
|
try:
|
|
696
696
|
row = cursor.fetchone()
|
|
697
697
|
finally:
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
698
|
+
# On DuckDB, raw_sql returns the shared connection itself; closing it
|
|
699
|
+
# would tear down the connection and break every subsequent check.
|
|
700
|
+
if cursor is not getattr(con, "con", None):
|
|
701
|
+
try:
|
|
702
|
+
cursor.close()
|
|
703
|
+
except Exception:
|
|
704
|
+
pass
|
|
702
705
|
return _py(row[0]) if row else None
|
|
703
706
|
|
|
704
707
|
|
|
@@ -848,6 +851,8 @@ def _resolve_col(columns: dict, field: str) -> str:
|
|
|
848
851
|
|
|
849
852
|
def _resolve_table(con, model: str):
|
|
850
853
|
"""Resolve a table by name, tolerating case differences across dialects."""
|
|
854
|
+
if getattr(con, "name", None) == "pyspark":
|
|
855
|
+
return _pyspark_table_unconvertible_as_unknown(con, model)
|
|
851
856
|
try:
|
|
852
857
|
return con.table(model)
|
|
853
858
|
except Exception:
|
|
@@ -861,6 +866,32 @@ def _resolve_table(con, model: str):
|
|
|
861
866
|
return con.table(match)
|
|
862
867
|
|
|
863
868
|
|
|
869
|
+
def _pyspark_table_unconvertible_as_unknown(con, name: str):
|
|
870
|
+
"""Reflect a pyspark table, typing any column whose Spark type Ibis cannot
|
|
871
|
+
convert (e.g. Databricks `VariantType`) as `Unknown`.
|
|
872
|
+
"""
|
|
873
|
+
import ibis
|
|
874
|
+
import ibis.expr.datatypes as dt
|
|
875
|
+
import ibis.expr.operations as ops
|
|
876
|
+
from ibis.backends.pyspark.datatypes import PySparkType
|
|
877
|
+
|
|
878
|
+
fields, unknown_columns = {}, []
|
|
879
|
+
for field in con._session.table(name).schema.fields:
|
|
880
|
+
try:
|
|
881
|
+
fields[field.name] = PySparkType.to_ibis(field.dataType)
|
|
882
|
+
except Exception:
|
|
883
|
+
fields[field.name] = dt.unknown
|
|
884
|
+
unknown_columns.append(f"{field.name} ({field.dataType.simpleString()})")
|
|
885
|
+
if not unknown_columns:
|
|
886
|
+
# Nothing unconvertible, resolve the table normally
|
|
887
|
+
return con.table(name)
|
|
888
|
+
logger.warning(
|
|
889
|
+
f"Model '{name}': column(s) {', '.join(unknown_columns)} have a type ibis cannot represent. "
|
|
890
|
+
f"Type checks for these columns will fail."
|
|
891
|
+
)
|
|
892
|
+
return ops.DatabaseTable(name, schema=ibis.schema(fields), source=con).to_expr()
|
|
893
|
+
|
|
894
|
+
|
|
864
895
|
def _py(value):
|
|
865
896
|
if value is None:
|
|
866
897
|
return None
|
|
@@ -119,12 +119,16 @@ importer_factory.register_lazy_importer(
|
|
|
119
119
|
module_path="datacontract.imports.excel_importer",
|
|
120
120
|
class_name="ExcelImporter",
|
|
121
121
|
)
|
|
122
|
+
importer_factory.register_lazy_importer(
|
|
123
|
+
name=ImportFormat.powerbi,
|
|
124
|
+
module_path="datacontract.imports.powerbi_importer",
|
|
125
|
+
class_name="PowerBiImporter",
|
|
126
|
+
)
|
|
122
127
|
importer_factory.register_lazy_importer(
|
|
123
128
|
name=ImportFormat.snowflake,
|
|
124
129
|
module_path="datacontract.imports.snowflake_importer",
|
|
125
130
|
class_name="SnowflakeImporter",
|
|
126
131
|
)
|
|
127
|
-
|
|
128
132
|
importer_factory.register_lazy_importer(
|
|
129
133
|
name=ImportFormat.json,
|
|
130
134
|
module_path="datacontract.imports.json_importer",
|