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.
Files changed (357) hide show
  1. {datacontract_cli-1.0.1/datacontract_cli.egg-info → datacontract_cli-1.0.3}/PKG-INFO +33 -7
  2. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/README.md +24 -1
  3. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_edit.py +73 -8
  4. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_import.py +20 -0
  5. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/connect.py +20 -2
  6. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/ibis_check_execute.py +35 -4
  7. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/importer.py +1 -0
  8. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/importer_factory.py +5 -1
  9. datacontract_cli-1.0.3/datacontract/imports/powerbi_importer.py +470 -0
  10. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3/datacontract_cli.egg-info}/PKG-INFO +33 -7
  11. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/SOURCES.txt +3 -0
  12. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/requires.txt +8 -5
  13. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/pyproject.toml +15 -8
  14. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_edit.py +77 -1
  15. datacontract_cli-1.0.3/tests/test_import_powerbi.py +479 -0
  16. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_dataframe.py +26 -0
  17. datacontract_cli-1.0.3/tests/test_test_quality_local_fallback.py +13 -0
  18. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/LICENSE +0 -0
  19. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/MANIFEST.in +0 -0
  20. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/__init__.py +0 -0
  21. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/api.py +0 -0
  22. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/catalog/catalog.py +0 -0
  23. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/__init__.py +0 -0
  24. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/changelog.py +0 -0
  25. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/changelog/normalize.py +0 -0
  26. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/cli.py +0 -0
  27. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_api.py +0 -0
  28. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_catalog.py +0 -0
  29. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_changelog.py +0 -0
  30. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_ci.py +0 -0
  31. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_dbt.py +0 -0
  32. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_export.py +0 -0
  33. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_init.py +0 -0
  34. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_lint.py +0 -0
  35. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_publish.py +0 -0
  36. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/command_test.py +0 -0
  37. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/data_contract.py +0 -0
  38. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/VERSION +0 -0
  39. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
  40. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
  41. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
  42. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
  43. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
  44. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
  45. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
  46. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
  47. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
  48. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
  49. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
  50. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
  51. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
  52. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
  53. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
  54. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
  55. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
  56. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/datacontract-editor.css +0 -0
  57. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
  58. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
  59. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
  60. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
  61. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
  62. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
  63. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
  64. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
  65. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
  66. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
  67. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
  68. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
  69. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
  70. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/index.html +0 -0
  71. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
  72. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/java-B260NeH3.js +0 -0
  73. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
  74. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
  75. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
  76. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
  77. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
  78. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
  79. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
  80. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  81. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
  82. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
  83. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
  84. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
  85. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
  86. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
  87. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
  88. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
  89. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
  90. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/odcs.svg +0 -0
  91. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
  92. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
  93. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
  94. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
  95. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
  96. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
  97. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
  98. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
  99. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
  100. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
  101. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
  102. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
  103. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
  104. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
  105. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
  106. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
  107. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
  108. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
  109. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
  110. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
  111. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
  112. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
  113. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
  114. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
  115. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
  116. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
  117. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
  118. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
  119. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
  120. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
  121. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
  122. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
  123. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
  124. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
  125. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
  126. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
  127. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
  128. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
  129. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
  130. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
  131. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
  132. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/__init__.py +0 -0
  133. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/__init__.py +0 -0
  134. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/check_spec.py +0 -0
  135. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/create_checks.py +0 -0
  136. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/checks/type_normalize.py +0 -0
  137. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/data_contract_test.py +0 -0
  138. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  139. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  140. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  141. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  142. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/__init__.py +0 -0
  143. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/__init__.py +0 -0
  144. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
  145. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/connections/kafka.py +0 -0
  146. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/engines/ibis/dtype_category.py +0 -0
  147. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/__init__.py +0 -0
  148. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/avro_exporter.py +0 -0
  149. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/avro_idl_exporter.py +0 -0
  150. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/bigquery_exporter.py +0 -0
  151. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/custom_exporter.py +0 -0
  152. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/data_caterer_exporter.py +0 -0
  153. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dbml_exporter.py +0 -0
  154. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dbt_exporter.py +0 -0
  155. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dcs_exporter.py +0 -0
  156. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/dqx_exporter.py +0 -0
  157. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/duckdb_type_converter.py +0 -0
  158. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/excel_exporter.py +0 -0
  159. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/exporter.py +0 -0
  160. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/exporter_factory.py +0 -0
  161. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/go_exporter.py +0 -0
  162. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/great_expectations_exporter.py +0 -0
  163. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/html_exporter.py +0 -0
  164. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/iceberg_exporter.py +0 -0
  165. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/jsonschema_exporter.py +0 -0
  166. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/markdown_exporter.py +0 -0
  167. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/mermaid_exporter.py +0 -0
  168. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/odcs_export_helper.py +0 -0
  169. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/odcs_v3_exporter.py +0 -0
  170. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/pandas_type_converter.py +0 -0
  171. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/protobuf_exporter.py +0 -0
  172. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/pydantic_exporter.py +0 -0
  173. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/rdf_exporter.py +0 -0
  174. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sodacl_check_builder.py +0 -0
  175. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sodacl_exporter.py +0 -0
  176. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/spark_exporter.py +0 -0
  177. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sql_exporter.py +0 -0
  178. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sql_type_converter.py +0 -0
  179. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/export/sqlalchemy_exporter.py +0 -0
  180. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/avro_importer.py +0 -0
  181. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/bigquery_importer.py +0 -0
  182. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/csv_importer.py +0 -0
  183. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dbml_importer.py +0 -0
  184. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dbt_importer.py +0 -0
  185. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/dcs_importer.py +0 -0
  186. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/excel_importer.py +0 -0
  187. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/glue_importer.py +0 -0
  188. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/iceberg_importer.py +0 -0
  189. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/json_importer.py +0 -0
  190. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/jsonschema_importer.py +0 -0
  191. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/odcs_helper.py +0 -0
  192. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/odcs_importer.py +0 -0
  193. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/parquet_importer.py +0 -0
  194. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/protobuf_importer.py +0 -0
  195. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/snowflake_importer.py +0 -0
  196. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/spark_importer.py +0 -0
  197. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/sql_importer.py +0 -0
  198. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/imports/unity_importer.py +0 -0
  199. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/init/init_template.py +0 -0
  200. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/dbt_sync.py +0 -0
  201. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/dbt_test_mapping.py +0 -0
  202. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/integration/entropy_data.py +0 -0
  203. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/files.py +0 -0
  204. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/resolve.py +0 -0
  205. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/resources.py +0 -0
  206. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/schema.py +0 -0
  207. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/lint/urls.py +0 -0
  208. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/changelog.py +0 -0
  209. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/exceptions.py +0 -0
  210. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/odcs.py +0 -0
  211. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/run.py +0 -0
  212. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/model/server.py +0 -0
  213. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/__init__.py +0 -0
  214. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/ci_output.py +0 -0
  215. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/json_test_results.py +0 -0
  216. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/junit_test_results.py +0 -0
  217. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/output_format.py +0 -0
  218. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/test_results_writer.py +0 -0
  219. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/output/text_changelog_results.py +0 -0
  220. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/py.typed +0 -0
  221. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  222. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  223. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  224. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  225. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  226. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  227. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  228. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  229. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  230. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  231. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/datacontract.html +0 -0
  232. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/datacontract_odcs.html +0 -0
  233. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/index.html +0 -0
  234. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_information.html +0 -0
  235. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  236. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/datacontract_terms.html +0 -0
  237. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/definition.html +0 -0
  238. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/example.html +0 -0
  239. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/model_field.html +0 -0
  240. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/quality.html +0 -0
  241. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/partials/server.html +0 -0
  242. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract/templates/style/output.css +0 -0
  243. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  244. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/entry_points.txt +0 -0
  245. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/datacontract_cli.egg-info/top_level.txt +0 -0
  246. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/setup.cfg +0 -0
  247. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_api.py +0 -0
  248. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_catalog.py +0 -0
  249. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog.py +0 -0
  250. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_engine.py +0 -0
  251. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_normalize.py +0 -0
  252. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_changelog_output_text.py +0 -0
  253. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_ci_output.py +0 -0
  254. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_cli.py +0 -0
  255. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_connect_databricks.py +0 -0
  256. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_connect_sqlserver.py +0 -0
  257. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract.py +0 -0
  258. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract_checks.py +0 -0
  259. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_data_contract_specification.py +0 -0
  260. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_dbt_sync.py +0 -0
  261. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_dbt_test_mapping.py +0 -0
  262. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_description_linter.py +0 -0
  263. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_download_datacontract_file.py +0 -0
  264. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_duckdb_json.py +0 -0
  265. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_avro.py +0 -0
  266. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_avro_idl.py +0 -0
  267. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_bigquery.py +0 -0
  268. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_complex_data_contract.py +0 -0
  269. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom.py +0 -0
  270. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom_exporter.py +0 -0
  271. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_custom_model.py +0 -0
  272. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_data_caterer.py +0 -0
  273. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbml.py +0 -0
  274. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_models.py +0 -0
  275. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_sources.py +0 -0
  276. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dbt_staging_sql.py +0 -0
  277. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_dqx.py +0 -0
  278. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_excel.py +0 -0
  279. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_go.py +0 -0
  280. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_great_expectations.py +0 -0
  281. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_html.py +0 -0
  282. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_iceberg.py +0 -0
  283. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_jsonschema.py +0 -0
  284. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_markdown.py +0 -0
  285. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_mermaid.py +0 -0
  286. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_odcs_v3.py +0 -0
  287. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_protobuf.py +0 -0
  288. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_pydantic.py +0 -0
  289. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_rdf.py +0 -0
  290. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sodacl.py +0 -0
  291. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_spark.py +0 -0
  292. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sql.py +0 -0
  293. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sql_query.py +0 -0
  294. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_export_sqlalchemy.py +0 -0
  295. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_ibis_mssql_pattern.py +0 -0
  296. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_avro.py +0 -0
  297. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_bigquery.py +0 -0
  298. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_csv.py +0 -0
  299. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_dbml.py +0 -0
  300. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_dbt.py +0 -0
  301. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_excel.py +0 -0
  302. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_glue.py +0 -0
  303. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_iceberg.py +0 -0
  304. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_json.py +0 -0
  305. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_jsonschema.py +0 -0
  306. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_odcs_v3.py +0 -0
  307. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_parquet.py +0 -0
  308. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_protobuf.py +0 -0
  309. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_snowflake.py +0 -0
  310. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_spark.py +0 -0
  311. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_oracle.py +0 -0
  312. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_postgres.py +0 -0
  313. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_snowflake.py +0 -0
  314. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_sql_sqlserver.py +0 -0
  315. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_import_unity_file.py +0 -0
  316. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_integration_entropydata.py +0 -0
  317. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_lint.py +0 -0
  318. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_require_env.py +0 -0
  319. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_resolve.py +0 -0
  320. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_resolve_definitions.py +0 -0
  321. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_roundtrip_jsonschema.py +0 -0
  322. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_sql_type_converter_physicaltype.py +0 -0
  323. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_api.py +0 -0
  324. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_athena_iceberg.py +0 -0
  325. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_azure_remote.py +0 -0
  326. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_bigquery.py +0 -0
  327. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_checks_filter.py +0 -0
  328. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_databricks.py +0 -0
  329. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_delta.py +0 -0
  330. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_diagnostics.py +0 -0
  331. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_failed_samples.py +0 -0
  332. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_gcs_csv_remote.py +0 -0
  333. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_gcs_json_remote.py +0 -0
  334. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_kafka.py +0 -0
  335. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_kafka_remote.py +0 -0
  336. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_local_json.py +0 -0
  337. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_local_json_nd.py +0 -0
  338. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_mysql.py +0 -0
  339. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_oracle.py +0 -0
  340. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_output_json.py +0 -0
  341. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_output_junit.py +0 -0
  342. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_parquet.py +0 -0
  343. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_postgres.py +0 -0
  344. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_quality.py +0 -0
  345. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_quality_percent_severity.py +0 -0
  346. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_csv.py +0 -0
  347. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_delta.py +0 -0
  348. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json.py +0 -0
  349. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_complex.py +0 -0
  350. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_multiple_models.py +0 -0
  351. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_s3_json_remote.py +0 -0
  352. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_schema_evolution.py +0 -0
  353. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_server_not_found.py +0 -0
  354. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_snowflake.py +0 -0
  355. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_soda_connection_error.py +0 -0
  356. {datacontract_cli-1.0.1 → datacontract_cli-1.0.3}/tests/test_test_sqlserver.py +0 -0
  357. {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.1
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.26,>=0.18.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.3.0,>=3.7.0; extra == "databricks"
42
- Requires-Dist: databricks-sdk<0.116.0; extra == "databricks"
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.137.0,>=0.115.0; extra == "api"
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.16; extra == "dev"
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, mirroring the CLI mode of the datacontract-editor npm launcher:
47
- load the YAML from the local file API, write it back on save, and point the
48
- editor's test runner at this server's own /test endpoint.
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: 'CLI',
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",
@@ -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
- kwargs["credentials"] = service_account.Credentials.from_service_account_file(credentials_path)
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
  )
@@ -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
- try:
699
- cursor.close()
700
- except Exception:
701
- pass
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
@@ -38,6 +38,7 @@ class ImportFormat(str, Enum):
38
38
  csv = "csv"
39
39
  protobuf = "protobuf"
40
40
  excel = "excel"
41
+ powerbi = "powerbi"
41
42
  snowflake = "snowflake"
42
43
 
43
44
  @classmethod
@@ -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",