datacontract-cli 1.0.1__tar.gz → 1.0.2__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 (354) hide show
  1. {datacontract_cli-1.0.1/datacontract_cli.egg-info → datacontract_cli-1.0.2}/PKG-INFO +8 -2
  2. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/README.md +5 -1
  3. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_edit.py +40 -3
  4. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/connections/connect.py +18 -2
  5. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/ibis_check_execute.py +28 -0
  6. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2/datacontract_cli.egg-info}/PKG-INFO +8 -2
  7. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract_cli.egg-info/requires.txt +2 -0
  8. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/pyproject.toml +9 -3
  9. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_edit.py +70 -1
  10. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_dataframe.py +26 -0
  11. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/LICENSE +0 -0
  12. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/MANIFEST.in +0 -0
  13. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/__init__.py +0 -0
  14. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/api.py +0 -0
  15. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/catalog/catalog.py +0 -0
  16. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/changelog/__init__.py +0 -0
  17. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/changelog/changelog.py +0 -0
  18. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/changelog/normalize.py +0 -0
  19. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/cli.py +0 -0
  20. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_api.py +0 -0
  21. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_catalog.py +0 -0
  22. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_changelog.py +0 -0
  23. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_ci.py +0 -0
  24. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_dbt.py +0 -0
  25. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_export.py +0 -0
  26. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_import.py +0 -0
  27. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_init.py +0 -0
  28. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_lint.py +0 -0
  29. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_publish.py +0 -0
  30. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/command_test.py +0 -0
  31. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/data_contract.py +0 -0
  32. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/VERSION +0 -0
  33. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
  34. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
  35. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
  36. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
  37. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
  38. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
  39. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
  40. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
  41. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
  42. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
  43. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
  44. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
  45. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
  46. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
  47. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
  48. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
  49. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
  50. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/datacontract-editor.css +0 -0
  51. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
  52. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
  53. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
  54. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
  55. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
  56. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
  57. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
  58. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
  59. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
  60. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
  61. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
  62. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
  63. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
  64. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/index.html +0 -0
  65. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
  66. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/java-B260NeH3.js +0 -0
  67. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
  68. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
  69. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
  70. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
  71. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
  72. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
  73. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
  74. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  75. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
  76. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
  77. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
  78. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
  79. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
  80. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
  81. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
  82. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
  83. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
  84. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/odcs.svg +0 -0
  85. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
  86. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
  87. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
  88. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
  89. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
  90. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
  91. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
  92. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
  93. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
  94. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
  95. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
  96. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
  97. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
  98. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
  99. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
  100. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
  101. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
  102. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
  103. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
  104. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
  105. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
  106. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
  107. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
  108. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
  109. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
  110. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
  111. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
  112. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
  113. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
  114. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
  115. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
  116. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
  117. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
  118. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
  119. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
  120. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
  121. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
  122. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
  123. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
  124. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
  125. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
  126. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/__init__.py +0 -0
  127. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/checks/__init__.py +0 -0
  128. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/checks/check_spec.py +0 -0
  129. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/checks/create_checks.py +0 -0
  130. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/checks/type_normalize.py +0 -0
  131. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/data_contract_test.py +0 -0
  132. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  133. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  134. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  135. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  136. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/__init__.py +0 -0
  137. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/connections/__init__.py +0 -0
  138. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
  139. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/connections/kafka.py +0 -0
  140. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/engines/ibis/dtype_category.py +0 -0
  141. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/__init__.py +0 -0
  142. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/avro_exporter.py +0 -0
  143. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/avro_idl_exporter.py +0 -0
  144. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/bigquery_exporter.py +0 -0
  145. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/custom_exporter.py +0 -0
  146. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/data_caterer_exporter.py +0 -0
  147. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/dbml_exporter.py +0 -0
  148. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/dbt_exporter.py +0 -0
  149. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/dcs_exporter.py +0 -0
  150. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/dqx_exporter.py +0 -0
  151. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/duckdb_type_converter.py +0 -0
  152. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/excel_exporter.py +0 -0
  153. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/exporter.py +0 -0
  154. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/exporter_factory.py +0 -0
  155. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/go_exporter.py +0 -0
  156. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/great_expectations_exporter.py +0 -0
  157. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/html_exporter.py +0 -0
  158. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/iceberg_exporter.py +0 -0
  159. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/jsonschema_exporter.py +0 -0
  160. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/markdown_exporter.py +0 -0
  161. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/mermaid_exporter.py +0 -0
  162. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/odcs_export_helper.py +0 -0
  163. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/odcs_v3_exporter.py +0 -0
  164. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/pandas_type_converter.py +0 -0
  165. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/protobuf_exporter.py +0 -0
  166. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/pydantic_exporter.py +0 -0
  167. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/rdf_exporter.py +0 -0
  168. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/sodacl_check_builder.py +0 -0
  169. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/sodacl_exporter.py +0 -0
  170. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/spark_exporter.py +0 -0
  171. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/sql_exporter.py +0 -0
  172. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/sql_type_converter.py +0 -0
  173. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/export/sqlalchemy_exporter.py +0 -0
  174. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/avro_importer.py +0 -0
  175. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/bigquery_importer.py +0 -0
  176. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/csv_importer.py +0 -0
  177. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/dbml_importer.py +0 -0
  178. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/dbt_importer.py +0 -0
  179. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/dcs_importer.py +0 -0
  180. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/excel_importer.py +0 -0
  181. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/glue_importer.py +0 -0
  182. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/iceberg_importer.py +0 -0
  183. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/importer.py +0 -0
  184. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/importer_factory.py +0 -0
  185. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/json_importer.py +0 -0
  186. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/jsonschema_importer.py +0 -0
  187. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/odcs_helper.py +0 -0
  188. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/odcs_importer.py +0 -0
  189. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/parquet_importer.py +0 -0
  190. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/protobuf_importer.py +0 -0
  191. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/snowflake_importer.py +0 -0
  192. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/spark_importer.py +0 -0
  193. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/sql_importer.py +0 -0
  194. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/imports/unity_importer.py +0 -0
  195. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/init/init_template.py +0 -0
  196. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/integration/dbt_sync.py +0 -0
  197. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/integration/dbt_test_mapping.py +0 -0
  198. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/integration/entropy_data.py +0 -0
  199. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/lint/files.py +0 -0
  200. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/lint/resolve.py +0 -0
  201. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/lint/resources.py +0 -0
  202. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/lint/schema.py +0 -0
  203. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/lint/urls.py +0 -0
  204. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/model/changelog.py +0 -0
  205. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/model/exceptions.py +0 -0
  206. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/model/odcs.py +0 -0
  207. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/model/run.py +0 -0
  208. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/model/server.py +0 -0
  209. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/__init__.py +0 -0
  210. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/ci_output.py +0 -0
  211. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/json_test_results.py +0 -0
  212. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/junit_test_results.py +0 -0
  213. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/output_format.py +0 -0
  214. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/test_results_writer.py +0 -0
  215. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/output/text_changelog_results.py +0 -0
  216. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/py.typed +0 -0
  217. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  218. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  219. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  220. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  221. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  222. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  223. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  224. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  225. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  226. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  227. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/datacontract.html +0 -0
  228. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/datacontract_odcs.html +0 -0
  229. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/index.html +0 -0
  230. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/datacontract_information.html +0 -0
  231. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  232. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/datacontract_terms.html +0 -0
  233. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/definition.html +0 -0
  234. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/example.html +0 -0
  235. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/model_field.html +0 -0
  236. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/quality.html +0 -0
  237. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/partials/server.html +0 -0
  238. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract/templates/style/output.css +0 -0
  239. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract_cli.egg-info/SOURCES.txt +0 -0
  240. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  241. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract_cli.egg-info/entry_points.txt +0 -0
  242. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/datacontract_cli.egg-info/top_level.txt +0 -0
  243. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/setup.cfg +0 -0
  244. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_api.py +0 -0
  245. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_catalog.py +0 -0
  246. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_changelog.py +0 -0
  247. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_changelog_engine.py +0 -0
  248. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_changelog_normalize.py +0 -0
  249. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_changelog_output_text.py +0 -0
  250. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_ci_output.py +0 -0
  251. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_cli.py +0 -0
  252. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_connect_databricks.py +0 -0
  253. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_connect_sqlserver.py +0 -0
  254. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_data_contract.py +0 -0
  255. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_data_contract_checks.py +0 -0
  256. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_data_contract_specification.py +0 -0
  257. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_dbt_sync.py +0 -0
  258. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_dbt_test_mapping.py +0 -0
  259. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_description_linter.py +0 -0
  260. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_download_datacontract_file.py +0 -0
  261. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_duckdb_json.py +0 -0
  262. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_avro.py +0 -0
  263. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_avro_idl.py +0 -0
  264. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_bigquery.py +0 -0
  265. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_complex_data_contract.py +0 -0
  266. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_custom.py +0 -0
  267. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_custom_exporter.py +0 -0
  268. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_custom_model.py +0 -0
  269. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_data_caterer.py +0 -0
  270. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_dbml.py +0 -0
  271. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_dbt_models.py +0 -0
  272. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_dbt_sources.py +0 -0
  273. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_dbt_staging_sql.py +0 -0
  274. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_dqx.py +0 -0
  275. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_excel.py +0 -0
  276. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_go.py +0 -0
  277. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_great_expectations.py +0 -0
  278. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_html.py +0 -0
  279. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_iceberg.py +0 -0
  280. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_jsonschema.py +0 -0
  281. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_markdown.py +0 -0
  282. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_mermaid.py +0 -0
  283. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_odcs_v3.py +0 -0
  284. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_protobuf.py +0 -0
  285. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_pydantic.py +0 -0
  286. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_rdf.py +0 -0
  287. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_sodacl.py +0 -0
  288. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_spark.py +0 -0
  289. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_sql.py +0 -0
  290. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_sql_query.py +0 -0
  291. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_export_sqlalchemy.py +0 -0
  292. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_ibis_mssql_pattern.py +0 -0
  293. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_avro.py +0 -0
  294. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_bigquery.py +0 -0
  295. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_csv.py +0 -0
  296. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_dbml.py +0 -0
  297. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_dbt.py +0 -0
  298. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_excel.py +0 -0
  299. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_glue.py +0 -0
  300. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_iceberg.py +0 -0
  301. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_json.py +0 -0
  302. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_jsonschema.py +0 -0
  303. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_odcs_v3.py +0 -0
  304. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_parquet.py +0 -0
  305. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_protobuf.py +0 -0
  306. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_snowflake.py +0 -0
  307. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_spark.py +0 -0
  308. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_sql_oracle.py +0 -0
  309. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_sql_postgres.py +0 -0
  310. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_sql_snowflake.py +0 -0
  311. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_sql_sqlserver.py +0 -0
  312. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_import_unity_file.py +0 -0
  313. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_integration_entropydata.py +0 -0
  314. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_lint.py +0 -0
  315. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_require_env.py +0 -0
  316. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_resolve.py +0 -0
  317. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_resolve_definitions.py +0 -0
  318. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_roundtrip_jsonschema.py +0 -0
  319. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_sql_type_converter_physicaltype.py +0 -0
  320. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_api.py +0 -0
  321. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_athena_iceberg.py +0 -0
  322. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_azure_remote.py +0 -0
  323. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_bigquery.py +0 -0
  324. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_checks_filter.py +0 -0
  325. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_databricks.py +0 -0
  326. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_delta.py +0 -0
  327. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_diagnostics.py +0 -0
  328. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_failed_samples.py +0 -0
  329. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_gcs_csv_remote.py +0 -0
  330. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_gcs_json_remote.py +0 -0
  331. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_kafka.py +0 -0
  332. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_kafka_remote.py +0 -0
  333. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_local_json.py +0 -0
  334. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_local_json_nd.py +0 -0
  335. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_mysql.py +0 -0
  336. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_oracle.py +0 -0
  337. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_output_json.py +0 -0
  338. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_output_junit.py +0 -0
  339. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_parquet.py +0 -0
  340. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_postgres.py +0 -0
  341. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_quality.py +0 -0
  342. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_quality_percent_severity.py +0 -0
  343. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_csv.py +0 -0
  344. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_delta.py +0 -0
  345. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_json.py +0 -0
  346. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_json_complex.py +0 -0
  347. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_json_multiple_models.py +0 -0
  348. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_s3_json_remote.py +0 -0
  349. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_schema_evolution.py +0 -0
  350. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_server_not_found.py +0 -0
  351. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_snowflake.py +0 -0
  352. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_soda_connection_error.py +0 -0
  353. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/tests/test_test_sqlserver.py +0 -0
  354. {datacontract_cli-1.0.1 → datacontract_cli-1.0.2}/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.2
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
@@ -51,8 +51,10 @@ Provides-Extra: mysql
51
51
  Requires-Dist: datacontract-cli[duckdb]; extra == "mysql"
52
52
  Provides-Extra: postgres
53
53
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "postgres"
54
+ Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "postgres"
54
55
  Provides-Extra: redshift
55
56
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "redshift"
57
+ Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "redshift"
56
58
  Provides-Extra: s3
57
59
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
58
60
  Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "s3"
@@ -430,6 +432,7 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
430
432
  Starts a local web server that opens the Data Contract Editor for the given file.
431
433
  The editor is bundled with the CLI, so no internet access is required.
432
434
  Saving in the editor writes directly back to the local file.
435
+ If a URL is given, you are asked whether to download a local copy, which is then edited.
433
436
  The server also acts as the editor's test runner: "Run test" in the editor executes
434
437
  the data contract tests locally against the servers defined in the data contract.
435
438
  Credentials for the data sources must be provided as environment variables, see
@@ -437,7 +440,9 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
437
440
 
438
441
  ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
439
442
  │ 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.
443
+ │ exist, you are asked whether to initialize a new data contract. If a
444
+ │ URL is given, you are asked whether to download a local copy to │
445
+ │ edit. │
441
446
  │ [default: datacontract.yaml] │
442
447
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
443
448
  ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
@@ -791,6 +796,7 @@ models:
791
796
  |----------------------------------------------|---------------------------|---------------------------------------------------------|
792
797
  | `DATACONTRACT_BIGQUERY_ACCOUNT_INFO_JSON_PATH` | `~/service-access-key.json` | Service Account key JSON file. If not set, ADC/WIF is used automatically. |
793
798
  | `DATACONTRACT_BIGQUERY_IMPERSONATION_ACCOUNT` | `sa@project.iam.gserviceaccount.com` | Optional. Service account to impersonate. Works with both key file and ADC auth. |
799
+ | `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
800
 
795
801
  </details>
796
802
 
@@ -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
 
@@ -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")
@@ -238,7 +270,8 @@ def edit(
238
270
  str,
239
271
  typer.Argument(
240
272
  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."
273
+ "If the file does not exist, you are asked whether to initialize a new data contract. "
274
+ "If a URL is given, you are asked whether to download a local copy to edit."
242
275
  ),
243
276
  ] = "datacontract.yaml",
244
277
  port: Annotated[int, typer.Option(help="Bind socket to this port.")] = 4243,
@@ -270,6 +303,7 @@ def edit(
270
303
  Starts a local web server that opens the Data Contract Editor for the given file.
271
304
  The editor is bundled with the CLI, so no internet access is required.
272
305
  Saving in the editor writes directly back to the local file.
306
+ If a URL is given, you are asked whether to download a local copy, which is then edited.
273
307
  The server also acts as the editor's test runner: "Run test" in the editor executes
274
308
  the data contract tests locally against the servers defined in the data contract.
275
309
  Credentials for the data sources must be provided as environment variables, see
@@ -283,6 +317,9 @@ def edit(
283
317
  console.print("[red]Install the extra datacontract-cli\\[api] to use edit.[/red]")
284
318
  raise typer.Exit(code=1)
285
319
 
320
+ if location.startswith("http://") or location.startswith("https://"):
321
+ location = _download_local_copy(location)
322
+
286
323
  file_path = Path(location).resolve()
287
324
  if file_path.suffix not in (".yaml", ".yml"):
288
325
  console.print("[red]Error: File must be a YAML file (.yaml or .yml).[/red]")
@@ -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":
@@ -848,6 +848,8 @@ def _resolve_col(columns: dict, field: str) -> str:
848
848
 
849
849
  def _resolve_table(con, model: str):
850
850
  """Resolve a table by name, tolerating case differences across dialects."""
851
+ if getattr(con, "name", None) == "pyspark":
852
+ return _pyspark_table_unconvertible_as_unknown(con, model)
851
853
  try:
852
854
  return con.table(model)
853
855
  except Exception:
@@ -861,6 +863,32 @@ def _resolve_table(con, model: str):
861
863
  return con.table(match)
862
864
 
863
865
 
866
+ def _pyspark_table_unconvertible_as_unknown(con, name: str):
867
+ """Reflect a pyspark table, typing any column whose Spark type Ibis cannot
868
+ convert (e.g. Databricks `VariantType`) as `Unknown`.
869
+ """
870
+ import ibis
871
+ import ibis.expr.datatypes as dt
872
+ import ibis.expr.operations as ops
873
+ from ibis.backends.pyspark.datatypes import PySparkType
874
+
875
+ fields, unknown_columns = {}, []
876
+ for field in con._session.table(name).schema.fields:
877
+ try:
878
+ fields[field.name] = PySparkType.to_ibis(field.dataType)
879
+ except Exception:
880
+ fields[field.name] = dt.unknown
881
+ unknown_columns.append(f"{field.name} ({field.dataType.simpleString()})")
882
+ if not unknown_columns:
883
+ # Nothing unconvertible, resolve the table normally
884
+ return con.table(name)
885
+ logger.warning(
886
+ f"Model '{name}': column(s) {', '.join(unknown_columns)} have a type ibis cannot represent. "
887
+ f"Type checks for these columns will fail."
888
+ )
889
+ return ops.DatabaseTable(name, schema=ibis.schema(fields), source=con).to_expr()
890
+
891
+
864
892
  def _py(value):
865
893
  if value is None:
866
894
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.0.1
3
+ Version: 1.0.2
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
@@ -51,8 +51,10 @@ Provides-Extra: mysql
51
51
  Requires-Dist: datacontract-cli[duckdb]; extra == "mysql"
52
52
  Provides-Extra: postgres
53
53
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "postgres"
54
+ Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "postgres"
54
55
  Provides-Extra: redshift
55
56
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "redshift"
57
+ Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "redshift"
56
58
  Provides-Extra: s3
57
59
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
58
60
  Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "s3"
@@ -430,6 +432,7 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
430
432
  Starts a local web server that opens the Data Contract Editor for the given file.
431
433
  The editor is bundled with the CLI, so no internet access is required.
432
434
  Saving in the editor writes directly back to the local file.
435
+ If a URL is given, you are asked whether to download a local copy, which is then edited.
433
436
  The server also acts as the editor's test runner: "Run test" in the editor executes
434
437
  the data contract tests locally against the servers defined in the data contract.
435
438
  Credentials for the data sources must be provided as environment variables, see
@@ -437,7 +440,9 @@ Usage: datacontract edit [OPTIONS] [LOCATION]
437
440
 
438
441
  ╭─ Arguments ──────────────────────────────────────────────────────────────────────────────────────╮
439
442
  │ 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.
443
+ │ exist, you are asked whether to initialize a new data contract. If a
444
+ │ URL is given, you are asked whether to download a local copy to │
445
+ │ edit. │
441
446
  │ [default: datacontract.yaml] │
442
447
  ╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
443
448
  ╭─ Options ────────────────────────────────────────────────────────────────────────────────────────╮
@@ -791,6 +796,7 @@ models:
791
796
  |----------------------------------------------|---------------------------|---------------------------------------------------------|
792
797
  | `DATACONTRACT_BIGQUERY_ACCOUNT_INFO_JSON_PATH` | `~/service-access-key.json` | Service Account key JSON file. If not set, ADC/WIF is used automatically. |
793
798
  | `DATACONTRACT_BIGQUERY_IMPERSONATION_ACCOUNT` | `sa@project.iam.gserviceaccount.com` | Optional. Service account to impersonate. Works with both key file and ADC auth. |
799
+ | `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
800
 
795
801
  </details>
796
802
 
@@ -98,6 +98,7 @@ pyarrow>=18.1.0
98
98
 
99
99
  [postgres]
100
100
  ibis-framework[postgres]<13.0.0,>=10.0.0
101
+ psycopg[binary]<4.0,>=3.1
101
102
 
102
103
  [protobuf]
103
104
  proto-schema-parser<3.0,>=1.0
@@ -107,6 +108,7 @@ rdflib==7.6.0
107
108
 
108
109
  [redshift]
109
110
  ibis-framework[postgres]<13.0.0,>=10.0.0
111
+ psycopg[binary]<4.0,>=3.1
110
112
 
111
113
  [s3]
112
114
  s3fs<2027.0.0,>=2025.2.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "datacontract-cli"
3
- version = "1.0.1"
3
+ version = "1.0.2"
4
4
  description = "The datacontract CLI is an open source command-line tool for working with Data Contracts. It uses data contract YAML files to lint the data contract, connect to data sources and execute schema and quality tests, detect breaking changes, and export to different formats. The tool is written in Python. It can be used as a standalone CLI tool, in a CI/CD pipeline, or directly as a Python library."
5
5
  license = "MIT"
6
6
  readme = "README.md"
@@ -86,12 +86,18 @@ mysql = [
86
86
  ]
87
87
 
88
88
  postgres = [
89
- "ibis-framework[postgres]>=10.0.0,<13.0.0"
89
+ "ibis-framework[postgres]>=10.0.0,<13.0.0",
90
+ # psycopg's binary wheels bundle libpq, so the extra works without
91
+ # PostgreSQL client libraries installed on the system.
92
+ "psycopg[binary]>=3.1,<4.0",
90
93
  ]
91
94
 
92
95
  redshift = [
93
96
  # Redshift speaks the postgres wire protocol; ibis has no dedicated backend.
94
- "ibis-framework[postgres]>=10.0.0,<13.0.0"
97
+ "ibis-framework[postgres]>=10.0.0,<13.0.0",
98
+ # psycopg's binary wheels bundle libpq, so the extra works without
99
+ # PostgreSQL client libraries installed on the system.
100
+ "psycopg[binary]>=3.1,<4.0",
95
101
  ]
96
102
 
97
103
  # DuckDB extension wheels are bundled for air-gapped installs. The 1.5.x line
@@ -6,7 +6,12 @@ from fastapi.testclient import TestClient
6
6
  from typer.testing import CliRunner
7
7
 
8
8
  from datacontract.cli import app
9
- from datacontract.command_edit import BUNDLED_EDITOR_ASSETS_DIR, create_app, resolve_editor_assets_url
9
+ from datacontract.command_edit import (
10
+ BUNDLED_EDITOR_ASSETS_DIR,
11
+ create_app,
12
+ local_copy_filename,
13
+ resolve_editor_assets_url,
14
+ )
10
15
 
11
16
  YAML_CONTENT = """apiVersion: v3.1.0
12
17
  kind: DataContract
@@ -49,6 +54,70 @@ def test_edit_aborts_when_initialization_is_declined(tmp_path):
49
54
  assert not file_path.exists()
50
55
 
51
56
 
57
+ def test_edit_downloads_a_local_copy_of_a_url(tmp_path, monkeypatch):
58
+ monkeypatch.chdir(tmp_path)
59
+ runner = CliRunner()
60
+ url = "https://example.com/contracts/orders.yaml"
61
+ with (
62
+ patch("datacontract.command_edit.fetch_resource", return_value=YAML_CONTENT) as mock_fetch,
63
+ patch("uvicorn.run") as mock_run,
64
+ ):
65
+ result = runner.invoke(app, ["edit", url, "--no-open"], input="y\n")
66
+ assert result.exit_code == 0
67
+ mock_fetch.assert_called_once_with(url)
68
+ assert (tmp_path / "orders.yaml").read_text(encoding="utf-8") == YAML_CONTENT
69
+ # saving in the editor goes to the local copy, not back to the URL
70
+ assert "local copy" in result.output
71
+ mock_run.assert_called_once()
72
+
73
+
74
+ def test_edit_downloads_a_url_with_the_entropy_data_api_key(tmp_path, monkeypatch):
75
+ monkeypatch.chdir(tmp_path)
76
+ monkeypatch.setenv("ENTROPY_DATA_API_KEY", "secret-key")
77
+ monkeypatch.delenv("DATAMESH_MANAGER_API_KEY", raising=False)
78
+ monkeypatch.delenv("DATACONTRACT_MANAGER_API_KEY", raising=False)
79
+ runner = CliRunner()
80
+ url = "https://app.entropy-data.com/contracts/orders.yaml"
81
+ response = MagicMock(status_code=200, text=YAML_CONTENT)
82
+ with patch("datacontract.lint.urls.requests.get", return_value=response) as mock_get, patch("uvicorn.run"):
83
+ result = runner.invoke(app, ["edit", url, "--no-open"], input="y\n")
84
+ assert result.exit_code == 0
85
+ mock_get.assert_called_once()
86
+ assert mock_get.call_args.kwargs["headers"]["x-api-key"] == "secret-key"
87
+ assert (tmp_path / "orders.yaml").read_text(encoding="utf-8") == YAML_CONTENT
88
+
89
+
90
+ def test_edit_aborts_when_local_copy_of_a_url_is_declined(tmp_path, monkeypatch):
91
+ monkeypatch.chdir(tmp_path)
92
+ runner = CliRunner()
93
+ with patch("datacontract.command_edit.fetch_resource") as mock_fetch:
94
+ result = runner.invoke(app, ["edit", "https://example.com/orders.yaml", "--no-open"], input="n\n")
95
+ assert result.exit_code == 1
96
+ mock_fetch.assert_not_called()
97
+ assert not (tmp_path / "orders.yaml").exists()
98
+
99
+
100
+ def test_edit_asks_before_overwriting_an_existing_local_copy(tmp_path, monkeypatch):
101
+ monkeypatch.chdir(tmp_path)
102
+ existing = tmp_path / "orders.yaml"
103
+ existing.write_text("local changes", encoding="utf-8")
104
+ runner = CliRunner()
105
+ with patch("datacontract.command_edit.fetch_resource") as mock_fetch:
106
+ result = runner.invoke(app, ["edit", "https://example.com/orders.yaml", "--no-open"], input="y\nn\n")
107
+ assert result.exit_code == 1
108
+ mock_fetch.assert_not_called()
109
+ assert existing.read_text(encoding="utf-8") == "local changes"
110
+
111
+
112
+ def test_local_copy_filename():
113
+ assert local_copy_filename("https://example.com/contracts/orders.yaml") == "orders.yaml"
114
+ assert local_copy_filename("https://example.com/contracts/orders.yml?version=2") == "orders.yml"
115
+ assert local_copy_filename("https://example.com/orders%20v2.yaml") == "orders v2.yaml"
116
+ # URLs without a YAML filename fall back to the default
117
+ assert local_copy_filename("https://example.com/api/contracts/12345") == "datacontract.yaml"
118
+ assert local_copy_filename("https://example.com/") == "datacontract.yaml"
119
+
120
+
52
121
  def test_index_serves_editor_page(client, contract_file):
53
122
  response = client.get("/")
54
123
  assert response.status_code == 200
@@ -172,3 +172,29 @@ def _prepare_fail_dataframe(spark):
172
172
  # Create temporary view
173
173
  # Name must match the model name in the data contract
174
174
  df.createOrReplaceTempView("my_table")
175
+
176
+
177
+ def test_pyspark_unconvertible_column_as_unknown(spark: SparkSession):
178
+ import ibis
179
+ import ibis.expr.datatypes as dt
180
+ from ibis.backends.pyspark.datatypes import PySparkType
181
+
182
+ from datacontract.engines.ibis.ibis_check_execute import _resolve_table
183
+
184
+ spark.sql("SELECT 1 AS id, INTERVAL '1-2' YEAR TO MONTH AS payload, 10 AS amount").createOrReplaceTempView(
185
+ "unconvertible_model"
186
+ )
187
+
188
+ # Sanity: the fixture column really is unconvertible for ibis
189
+ payload_type = spark.table("unconvertible_model").schema["payload"].dataType
190
+ with pytest.raises(Exception):
191
+ PySparkType.to_ibis(payload_type)
192
+
193
+ con = ibis.pyspark.connect(session=spark)
194
+ t = _resolve_table(con, "unconvertible_model")
195
+
196
+ assert set(t.columns) == {"id", "payload", "amount"} # kept
197
+ assert isinstance(t.schema()["payload"], dt.Unknown) # typed opaque
198
+ assert t.count().execute() == 1 # table is queryable
199
+ assert t.amount.isnull().sum().execute() == 0 # checks on other columns run
200
+ assert t.payload.isnull().sum().execute() == 0 # not-null still works on the opaque column