datacontract-cli 1.0.13__tar.gz → 1.0.14__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.

Potentially problematic release.


This version of datacontract-cli might be problematic. Click here for more details.

Files changed (377) hide show
  1. {datacontract_cli-1.0.13/datacontract_cli.egg-info → datacontract_cli-1.0.14}/PKG-INFO +12 -5
  2. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/protobuf_exporter.py +29 -4
  3. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/integration/dbt_sync.py +14 -2
  4. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/lint/resolve.py +4 -3
  5. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14/datacontract_cli.egg-info}/PKG-INFO +12 -5
  6. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract_cli.egg-info/requires.txt +11 -4
  7. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/pyproject.toml +24 -10
  8. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_dbt_sync.py +26 -0
  9. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_protobuf.py +59 -1
  10. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/LICENSE +0 -0
  11. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/MANIFEST.in +0 -0
  12. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/README.md +0 -0
  13. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/__init__.py +0 -0
  14. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/api.py +0 -0
  15. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/catalog/catalog.py +0 -0
  16. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/changelog/__init__.py +0 -0
  17. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/changelog/changelog.py +0 -0
  18. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/changelog/normalize.py +0 -0
  19. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/cli.py +0 -0
  20. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_api.py +0 -0
  21. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_catalog.py +0 -0
  22. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_changelog.py +0 -0
  23. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_ci.py +0 -0
  24. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_dbt.py +0 -0
  25. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_edit.py +0 -0
  26. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_export.py +0 -0
  27. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_import.py +0 -0
  28. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_init.py +0 -0
  29. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_lint.py +0 -0
  30. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_publish.py +0 -0
  31. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/command_test.py +0 -0
  32. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/data_contract.py +0 -0
  33. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/VERSION +0 -0
  34. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
  35. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
  36. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
  37. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
  38. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
  39. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
  40. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
  41. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
  42. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
  43. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
  44. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
  45. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
  46. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
  47. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
  48. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
  49. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
  50. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
  51. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/datacontract-editor.css +0 -0
  52. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
  53. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
  54. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
  55. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
  56. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
  57. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
  58. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
  59. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
  60. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
  61. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
  62. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
  63. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
  64. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
  65. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/index.html +0 -0
  66. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
  67. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/java-B260NeH3.js +0 -0
  68. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
  69. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
  70. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
  71. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
  72. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
  73. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
  74. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
  75. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  76. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
  77. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
  78. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
  79. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
  80. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
  81. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
  82. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
  83. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
  84. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
  85. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/odcs.svg +0 -0
  86. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
  87. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
  88. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
  89. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
  90. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
  91. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
  92. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
  93. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
  94. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
  95. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
  96. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
  97. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
  98. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
  99. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
  100. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
  101. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
  102. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
  103. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
  104. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
  105. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
  106. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
  107. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
  108. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
  109. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
  110. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
  111. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
  112. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
  113. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
  114. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
  115. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
  116. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
  117. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
  118. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
  119. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
  120. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
  121. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
  122. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
  123. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
  124. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
  125. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
  126. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
  127. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/__init__.py +0 -0
  128. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/checks/__init__.py +0 -0
  129. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/checks/check_spec.py +0 -0
  130. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/checks/create_checks.py +0 -0
  131. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/checks/physical_type_match.py +0 -0
  132. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/checks/type_normalize.py +0 -0
  133. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/data_contract_test.py +0 -0
  134. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/datacontract/check_azure_blob_file.py +0 -0
  135. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  136. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  137. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  138. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  139. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/__init__.py +0 -0
  140. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/__init__.py +0 -0
  141. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/connect.py +0 -0
  142. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
  143. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/kafka.py +0 -0
  144. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
  145. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
  146. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/dtype_category.py +0 -0
  147. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/ibis_check_execute.py +0 -0
  148. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/native_type.py +0 -0
  149. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/engines/ibis/snowflake_structured_types.py +0 -0
  150. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/__init__.py +0 -0
  151. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/avro_exporter.py +0 -0
  152. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/avro_idl_exporter.py +0 -0
  153. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/bigquery_exporter.py +0 -0
  154. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/custom_exporter.py +0 -0
  155. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/data_caterer_exporter.py +0 -0
  156. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/dbml_exporter.py +0 -0
  157. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/dbt_exporter.py +0 -0
  158. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/dcs_exporter.py +0 -0
  159. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/dqx_exporter.py +0 -0
  160. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/duckdb_type_converter.py +0 -0
  161. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/excel_exporter.py +0 -0
  162. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/exporter.py +0 -0
  163. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/exporter_factory.py +0 -0
  164. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/go_exporter.py +0 -0
  165. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/great_expectations_exporter.py +0 -0
  166. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/html_exporter.py +0 -0
  167. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/iceberg_exporter.py +0 -0
  168. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/jsonschema_exporter.py +0 -0
  169. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/markdown_exporter.py +0 -0
  170. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/mermaid_exporter.py +0 -0
  171. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/odcs_export_helper.py +0 -0
  172. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/odcs_v3_exporter.py +0 -0
  173. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/pandas_type_converter.py +0 -0
  174. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/pydantic_exporter.py +0 -0
  175. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/rdf_exporter.py +0 -0
  176. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/sodacl_check_builder.py +0 -0
  177. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/sodacl_exporter.py +0 -0
  178. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/spark_exporter.py +0 -0
  179. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/sql_exporter.py +0 -0
  180. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/sql_type_converter.py +0 -0
  181. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/export/sqlalchemy_exporter.py +0 -0
  182. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/avro_importer.py +0 -0
  183. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/bigquery_importer.py +0 -0
  184. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/csv_importer.py +0 -0
  185. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/dbml_importer.py +0 -0
  186. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/dbt_importer.py +0 -0
  187. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/dcs_importer.py +0 -0
  188. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/excel_importer.py +0 -0
  189. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/glue_importer.py +0 -0
  190. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/iceberg_importer.py +0 -0
  191. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/importer.py +0 -0
  192. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/importer_factory.py +0 -0
  193. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/json_importer.py +0 -0
  194. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/jsonschema_importer.py +0 -0
  195. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/odcs_helper.py +0 -0
  196. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/odcs_importer.py +0 -0
  197. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/parquet_importer.py +0 -0
  198. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/powerbi_importer.py +0 -0
  199. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/protobuf_importer.py +0 -0
  200. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/snowflake_importer.py +0 -0
  201. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/spark_importer.py +0 -0
  202. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/sql_importer.py +0 -0
  203. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/imports/unity_importer.py +0 -0
  204. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/init/init_template.py +0 -0
  205. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/integration/dbt_test_mapping.py +0 -0
  206. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/integration/entropy_data.py +0 -0
  207. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/lint/files.py +0 -0
  208. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/lint/resources.py +0 -0
  209. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/lint/schema.py +0 -0
  210. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/lint/urls.py +0 -0
  211. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/model/changelog.py +0 -0
  212. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/model/exceptions.py +0 -0
  213. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/model/odcs.py +0 -0
  214. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/model/run.py +0 -0
  215. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/model/server.py +0 -0
  216. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/__init__.py +0 -0
  217. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/ci_output.py +0 -0
  218. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/json_test_results.py +0 -0
  219. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/junit_test_results.py +0 -0
  220. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/output_format.py +0 -0
  221. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/test_results_writer.py +0 -0
  222. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/output/text_changelog_results.py +0 -0
  223. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/py.typed +0 -0
  224. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  225. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  226. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  227. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  228. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  229. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  230. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  231. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  232. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  233. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  234. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/datacontract.html +0 -0
  235. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/datacontract_odcs.html +0 -0
  236. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/index.html +0 -0
  237. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/datacontract_information.html +0 -0
  238. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  239. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/datacontract_terms.html +0 -0
  240. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/definition.html +0 -0
  241. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/example.html +0 -0
  242. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/model_field.html +0 -0
  243. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/quality.html +0 -0
  244. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/partials/server.html +0 -0
  245. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract/templates/style/output.css +0 -0
  246. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract_cli.egg-info/SOURCES.txt +0 -0
  247. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  248. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract_cli.egg-info/entry_points.txt +0 -0
  249. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/datacontract_cli.egg-info/top_level.txt +0 -0
  250. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/setup.cfg +0 -0
  251. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_api.py +0 -0
  252. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_catalog.py +0 -0
  253. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_changelog.py +0 -0
  254. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_changelog_engine.py +0 -0
  255. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_changelog_normalize.py +0 -0
  256. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_changelog_output_text.py +0 -0
  257. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_ci_output.py +0 -0
  258. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_cli.py +0 -0
  259. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_connect_databricks.py +0 -0
  260. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_connect_sqlserver.py +0 -0
  261. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_connect_trino.py +0 -0
  262. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_create_checks_nested_type.py +0 -0
  263. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_create_checks_physical_type.py +0 -0
  264. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_data_contract.py +0 -0
  265. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_data_contract_checks.py +0 -0
  266. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_data_contract_specification.py +0 -0
  267. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_dbt_test_mapping.py +0 -0
  268. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_description_linter.py +0 -0
  269. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_download_datacontract_file.py +0 -0
  270. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_dtype_category.py +0 -0
  271. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_duckdb_json.py +0 -0
  272. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_edit.py +0 -0
  273. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_avro.py +0 -0
  274. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_avro_idl.py +0 -0
  275. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_bigquery.py +0 -0
  276. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_complex_data_contract.py +0 -0
  277. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_custom.py +0 -0
  278. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_custom_exporter.py +0 -0
  279. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_custom_model.py +0 -0
  280. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_data_caterer.py +0 -0
  281. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_dbml.py +0 -0
  282. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_dbt_models.py +0 -0
  283. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_dbt_sources.py +0 -0
  284. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_dbt_staging_sql.py +0 -0
  285. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_dqx.py +0 -0
  286. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_excel.py +0 -0
  287. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_go.py +0 -0
  288. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_great_expectations.py +0 -0
  289. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_html.py +0 -0
  290. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_iceberg.py +0 -0
  291. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_jsonschema.py +0 -0
  292. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_markdown.py +0 -0
  293. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_mermaid.py +0 -0
  294. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_odcs_v3.py +0 -0
  295. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_pydantic.py +0 -0
  296. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_rdf.py +0 -0
  297. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_sodacl.py +0 -0
  298. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_spark.py +0 -0
  299. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_sql.py +0 -0
  300. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_sql_clickhouse.py +0 -0
  301. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_sql_query.py +0 -0
  302. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_export_sqlalchemy.py +0 -0
  303. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_ibis_mssql_pattern.py +0 -0
  304. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_ibis_oracle_schema.py +0 -0
  305. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_avro.py +0 -0
  306. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_bigquery.py +0 -0
  307. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_csv.py +0 -0
  308. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_dbml.py +0 -0
  309. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_dbt.py +0 -0
  310. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_excel.py +0 -0
  311. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_glue.py +0 -0
  312. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_iceberg.py +0 -0
  313. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_json.py +0 -0
  314. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_jsonschema.py +0 -0
  315. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_odcs_v3.py +0 -0
  316. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_parquet.py +0 -0
  317. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_powerbi.py +0 -0
  318. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_protobuf.py +0 -0
  319. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_snowflake.py +0 -0
  320. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_spark.py +0 -0
  321. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_sql_oracle.py +0 -0
  322. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_sql_postgres.py +0 -0
  323. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_sql_snowflake.py +0 -0
  324. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_sql_sqlserver.py +0 -0
  325. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_import_unity_file.py +0 -0
  326. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_integration_entropydata.py +0 -0
  327. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_lint.py +0 -0
  328. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_oracle_patch.py +0 -0
  329. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_physical_type_match.py +0 -0
  330. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_redshift_patch.py +0 -0
  331. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_require_env.py +0 -0
  332. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_resolve.py +0 -0
  333. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_resolve_definitions.py +0 -0
  334. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_roundtrip_jsonschema.py +0 -0
  335. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_snowflake_structured_types.py +0 -0
  336. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_sql_type_converter_physicaltype.py +0 -0
  337. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_api.py +0 -0
  338. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_athena_iceberg.py +0 -0
  339. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_azure_blob_file.py +0 -0
  340. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_azure_remote.py +0 -0
  341. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_bigquery.py +0 -0
  342. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_checks_filter.py +0 -0
  343. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_databricks.py +0 -0
  344. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_dataframe.py +0 -0
  345. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_delta.py +0 -0
  346. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_diagnostics.py +0 -0
  347. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_failed_samples.py +0 -0
  348. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_gcs_csv_remote.py +0 -0
  349. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_gcs_json_remote.py +0 -0
  350. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_kafka.py +0 -0
  351. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_kafka_remote.py +0 -0
  352. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_local_json.py +0 -0
  353. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_local_json_nd.py +0 -0
  354. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_mysql.py +0 -0
  355. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_oracle.py +0 -0
  356. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_oracle_xe.py +0 -0
  357. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_output_json.py +0 -0
  358. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_output_junit.py +0 -0
  359. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_parquet.py +0 -0
  360. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_postgres.py +0 -0
  361. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_quality.py +0 -0
  362. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_quality_local_fallback.py +0 -0
  363. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_quality_percent_severity.py +0 -0
  364. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_redshift.py +0 -0
  365. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_csv.py +0 -0
  366. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_delta.py +0 -0
  367. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_json.py +0 -0
  368. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_json_complex.py +0 -0
  369. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_json_multiple_models.py +0 -0
  370. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_s3_json_remote.py +0 -0
  371. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_schema_evolution.py +0 -0
  372. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_server_not_found.py +0 -0
  373. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_snowflake.py +0 -0
  374. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_soda_connection_error.py +0 -0
  375. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_sqlserver.py +0 -0
  376. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_test_trino.py +0 -0
  377. {datacontract_cli-1.0.13 → datacontract_cli-1.0.14}/tests/test_type_normalize.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.0.13
3
+ Version: 1.0.14
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,7 @@ 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.27,>=0.18.0
14
+ Requires-Dist: typer<0.28,>=0.18.0
15
15
  Requires-Dist: click<9.0.0,>=8.1.0
16
16
  Requires-Dist: pydantic<2.14.0,>=2.8.2
17
17
  Requires-Dist: pyyaml~=6.0.1
@@ -42,7 +42,7 @@ Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
42
42
  Provides-Extra: databricks
43
43
  Requires-Dist: ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0; extra == "databricks"
44
44
  Requires-Dist: databricks-sql-connector<4.4.0,>=3.7.0; extra == "databricks"
45
- Requires-Dist: databricks-sdk<0.121.0; extra == "databricks"
45
+ Requires-Dist: databricks-sdk<0.122.0; extra == "databricks"
46
46
  Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
47
47
  Provides-Extra: iceberg
48
48
  Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
@@ -55,9 +55,11 @@ Requires-Dist: datacontract-cli[duckdb]; extra == "mysql"
55
55
  Provides-Extra: postgres
56
56
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "postgres"
57
57
  Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "postgres"
58
+ Requires-Dist: packaging<27.0,>=21.3; extra == "postgres"
58
59
  Provides-Extra: redshift
59
60
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "redshift"
60
61
  Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "redshift"
62
+ Requires-Dist: packaging<27.0,>=21.3; extra == "redshift"
61
63
  Provides-Extra: s3
62
64
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
63
65
  Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "s3"
@@ -71,18 +73,23 @@ Requires-Dist: duckdb-extension-azure<1.6.0,>=1.5.0; extra == "azure"
71
73
  Requires-Dist: azure-identity<1.26,>=1.17.1; extra == "azure"
72
74
  Requires-Dist: azure-storage-blob<12.31,>=12.24; extra == "azure"
73
75
  Provides-Extra: snowflake
74
- Requires-Dist: snowflake-connector-python[pandas]<4.7,>=3.6; extra == "snowflake"
76
+ Requires-Dist: snowflake-connector-python[pandas]<4.8,>=3.6; extra == "snowflake"
75
77
  Requires-Dist: ibis-framework[snowflake]<13.0.0,>=10.0.0; extra == "snowflake"
76
78
  Provides-Extra: sqlserver
77
79
  Requires-Dist: ibis-framework[mssql]<13.0.0,>=10.0.0; extra == "sqlserver"
80
+ Requires-Dist: packaging<27.0,>=21.3; extra == "sqlserver"
78
81
  Provides-Extra: oracle
79
82
  Requires-Dist: ibis-framework[oracle]<13.0.0,>=10.0.0; extra == "oracle"
83
+ Requires-Dist: packaging<27.0,>=21.3; extra == "oracle"
80
84
  Provides-Extra: athena
81
85
  Requires-Dist: ibis-framework[athena]<13.0.0,>=10.0.0; extra == "athena"
86
+ Requires-Dist: packaging<27.0,>=21.3; extra == "athena"
82
87
  Provides-Extra: trino
83
88
  Requires-Dist: ibis-framework[trino]<13.0.0,>=10.0.0; extra == "trino"
89
+ Requires-Dist: packaging<27.0,>=21.3; extra == "trino"
84
90
  Provides-Extra: impala
85
91
  Requires-Dist: ibis-framework[impala]<13.0.0,>=10.0.0; extra == "impala"
92
+ Requires-Dist: packaging<27.0,>=21.3; extra == "impala"
86
93
  Provides-Extra: dbml
87
94
  Requires-Dist: pydbml>=1.1.1; extra == "dbml"
88
95
  Provides-Extra: duckdb
@@ -112,7 +119,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
112
119
  Requires-Dist: pymssql==2.3.13; extra == "dev"
113
120
  Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
114
121
  Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "dev"
115
- Requires-Dist: ruff==0.15.21; extra == "dev"
122
+ Requires-Dist: ruff==0.15.22; extra == "dev"
116
123
  Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2; extra == "dev"
117
124
  Requires-Dist: trino==0.338.0; extra == "dev"
118
125
  Dynamic: license-file
@@ -1,11 +1,16 @@
1
+ import re
1
2
  from typing import List, Optional
2
3
 
3
4
  from open_data_contract_standard.model import OpenDataContractStandard, SchemaProperty
4
5
 
5
6
  from datacontract.export.exporter import Exporter
7
+ from datacontract.model.exceptions import DataContractException
6
8
 
7
9
  OBJECT_TYPES: set = {"object", "record", "struct"}
8
10
 
11
+ # A valid proto package is a dot-separated sequence of identifiers.
12
+ _PROTO_PACKAGE_PATTERN = re.compile(r"^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)*$")
13
+
9
14
 
10
15
  class ProtoBufExporter(Exporter):
11
16
  def export(self, data_contract, schema_name, server, sql_server_type, export_args) -> str:
@@ -31,6 +36,27 @@ def _get_logical_type_option(prop: SchemaProperty, key: str):
31
36
  return prop.logicalTypeOptions.get(key)
32
37
 
33
38
 
39
+ def _get_proto_package_name(data_contract: OpenDataContractStandard) -> str:
40
+ """
41
+ Returns the Protobuf package name from the contract's customProperties
42
+ ("protoPackageName"), falling back to "example".
43
+ """
44
+ if data_contract.customProperties is None:
45
+ return "example"
46
+ for cp in data_contract.customProperties:
47
+ if cp.property == "protoPackageName" and cp.value:
48
+ if not _PROTO_PACKAGE_PATTERN.match(cp.value):
49
+ raise DataContractException(
50
+ type="protobuf-export",
51
+ name="invalid-proto-package-name",
52
+ reason=f"Invalid protoPackageName '{cp.value}'. "
53
+ "Must be a dot-separated sequence of identifiers, e.g. 'com.example.mydata'.",
54
+ engine="datacontract",
55
+ )
56
+ return cp.value
57
+ return "example"
58
+
59
+
34
60
  def to_protobuf(data_contract: OpenDataContractStandard) -> str:
35
61
  """
36
62
  Generates a Protobuf file from the data contract specification.
@@ -58,7 +84,7 @@ def to_protobuf(data_contract: OpenDataContractStandard) -> str:
58
84
 
59
85
  # Build header with syntax and package declarations.
60
86
  header = 'syntax = "proto3";\n\n'
61
- package = "example" # Default package, can be customized
87
+ package: str = _get_proto_package_name(data_contract)
62
88
  header += f"package {package};\n\n"
63
89
 
64
90
  # Append enum definitions before messages.
@@ -348,9 +374,8 @@ def _get_field_declaration(prop: SchemaProperty) -> str:
348
374
 
349
375
  logical_type = (prop.logicalType or "").lower()
350
376
  is_array = logical_type == "array"
351
- is_message_type = logical_type in OBJECT_TYPES
352
377
 
353
- # Add 'optional' only for non-required, non-array, non-message fields (scalars/enums)
354
- if hasattr(prop, "required") and prop.required is False and not is_array and not is_message_type:
378
+ # Add 'optional' only for non-required, non-array
379
+ if hasattr(prop, "required") and prop.required is False and not is_array:
355
380
  return f"optional {field_type}"
356
381
  return field_type
@@ -482,9 +482,11 @@ def _singular_tests_for_qualities(
482
482
  *,
483
483
  label_prefix: str = "",
484
484
  field: Optional[str] = None,
485
+ model_version: Optional[str] = None,
485
486
  ) -> list[SingularTest]:
486
487
  """Generate singular tests for ODCS quality entries that have an associated `query` and bound."""
487
488
  out: list[SingularTest] = []
489
+ model_ref = _model_ref(model, model_version)
488
490
  for idx, quality in enumerate(qualities or [], start=1):
489
491
  if not quality.query:
490
492
  continue
@@ -495,13 +497,18 @@ def _singular_tests_for_qualities(
495
497
  f"Skipping singular SQL test `{test_label}` on `{model}`: quality has a `query` but no `mustBe*` bound."
496
498
  )
497
499
  continue
500
+ # Resolve the ODCS model/field placeholders to dbt constructs. `{schema}` (which the test
501
+ # engine also resolves) has no clean dbt equivalent and is intentionally left untouched.
502
+ query = re.sub(r'["\']?\$?\{(model|table|object)}["\']?', model_ref, quality.query)
503
+ if field is not None:
504
+ query = re.sub(r'["\']?\$?\{(field|column|property)}["\']?', field, query)
498
505
  severity = _normalize_severity(quality.severity)
499
506
  filename = f"{_slugify(contract_id)}__{_slugify(contract_version)}__{_slugify(model)}__{_slugify(test_label)}"
500
507
  out.append(
501
508
  SingularTest(
502
509
  filename=f"{filename}.sql",
503
510
  sql=_build_singular_sql(
504
- quality.query,
511
+ query,
505
512
  predicate,
506
513
  severity,
507
514
  contract_id,
@@ -982,9 +989,14 @@ def generate_dbt_tests_for_schema(
982
989
  run,
983
990
  label_prefix=f"{prop.name}__",
984
991
  field=prop.name,
992
+ model_version=model_version,
985
993
  )
986
994
  )
987
- singulars.extend(_singular_tests_for_qualities(schema_obj.quality, contract_id, contract_version, model_name, run))
995
+ singulars.extend(
996
+ _singular_tests_for_qualities(
997
+ schema_obj.quality, contract_id, contract_version, model_name, run, model_version=model_version
998
+ )
999
+ )
988
1000
  _disambiguate_singular_filenames(singulars)
989
1001
 
990
1002
  return model_dict, singulars
@@ -44,11 +44,12 @@ _SafeLoaderNoTimestamp.yaml_implicit_resolvers = {
44
44
 
45
45
 
46
46
  def _resolve_jsonschema_compliance_error_message_path(yaml_str, message):
47
+ except_message = message
48
+
47
49
  try:
48
50
  matches = re.findall(r"\[(\d+)\]", message)
49
51
  schema_index = matches[0] if len(matches) > 0 else None
50
52
  property_index = matches[1] if len(matches) > 1 else None
51
- except_message = message
52
53
  if schema_index is not None and "schema" in yaml_str and int(schema_index) < len(yaml_str["schema"]):
53
54
  except_message = except_message.replace(
54
55
  f"schema[{schema_index}]", f"schema.{yaml_str['schema'][int(schema_index)]['name']}"
@@ -68,8 +69,8 @@ def _resolve_jsonschema_compliance_error_message_path(yaml_str, message):
68
69
  except Exception:
69
70
  logging.warning("YAML doesn't conform to JSON schema. Could not resolve indexed schema or property names.")
70
71
  except_message = message
71
- finally:
72
- return except_message
72
+
73
+ return except_message
73
74
 
74
75
 
75
76
  def resolve_data_contract_dict(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.0.13
3
+ Version: 1.0.14
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,7 @@ 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.27,>=0.18.0
14
+ Requires-Dist: typer<0.28,>=0.18.0
15
15
  Requires-Dist: click<9.0.0,>=8.1.0
16
16
  Requires-Dist: pydantic<2.14.0,>=2.8.2
17
17
  Requires-Dist: pyyaml~=6.0.1
@@ -42,7 +42,7 @@ Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
42
42
  Provides-Extra: databricks
43
43
  Requires-Dist: ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0; extra == "databricks"
44
44
  Requires-Dist: databricks-sql-connector<4.4.0,>=3.7.0; extra == "databricks"
45
- Requires-Dist: databricks-sdk<0.121.0; extra == "databricks"
45
+ Requires-Dist: databricks-sdk<0.122.0; extra == "databricks"
46
46
  Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
47
47
  Provides-Extra: iceberg
48
48
  Requires-Dist: pyiceberg==0.11.1; extra == "iceberg"
@@ -55,9 +55,11 @@ Requires-Dist: datacontract-cli[duckdb]; extra == "mysql"
55
55
  Provides-Extra: postgres
56
56
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "postgres"
57
57
  Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "postgres"
58
+ Requires-Dist: packaging<27.0,>=21.3; extra == "postgres"
58
59
  Provides-Extra: redshift
59
60
  Requires-Dist: ibis-framework[postgres]<13.0.0,>=10.0.0; extra == "redshift"
60
61
  Requires-Dist: psycopg[binary]<4.0,>=3.1; extra == "redshift"
62
+ Requires-Dist: packaging<27.0,>=21.3; extra == "redshift"
61
63
  Provides-Extra: s3
62
64
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
63
65
  Requires-Dist: duckdb-extension-httpfs<1.6.0,>=1.5.0; extra == "s3"
@@ -71,18 +73,23 @@ Requires-Dist: duckdb-extension-azure<1.6.0,>=1.5.0; extra == "azure"
71
73
  Requires-Dist: azure-identity<1.26,>=1.17.1; extra == "azure"
72
74
  Requires-Dist: azure-storage-blob<12.31,>=12.24; extra == "azure"
73
75
  Provides-Extra: snowflake
74
- Requires-Dist: snowflake-connector-python[pandas]<4.7,>=3.6; extra == "snowflake"
76
+ Requires-Dist: snowflake-connector-python[pandas]<4.8,>=3.6; extra == "snowflake"
75
77
  Requires-Dist: ibis-framework[snowflake]<13.0.0,>=10.0.0; extra == "snowflake"
76
78
  Provides-Extra: sqlserver
77
79
  Requires-Dist: ibis-framework[mssql]<13.0.0,>=10.0.0; extra == "sqlserver"
80
+ Requires-Dist: packaging<27.0,>=21.3; extra == "sqlserver"
78
81
  Provides-Extra: oracle
79
82
  Requires-Dist: ibis-framework[oracle]<13.0.0,>=10.0.0; extra == "oracle"
83
+ Requires-Dist: packaging<27.0,>=21.3; extra == "oracle"
80
84
  Provides-Extra: athena
81
85
  Requires-Dist: ibis-framework[athena]<13.0.0,>=10.0.0; extra == "athena"
86
+ Requires-Dist: packaging<27.0,>=21.3; extra == "athena"
82
87
  Provides-Extra: trino
83
88
  Requires-Dist: ibis-framework[trino]<13.0.0,>=10.0.0; extra == "trino"
89
+ Requires-Dist: packaging<27.0,>=21.3; extra == "trino"
84
90
  Provides-Extra: impala
85
91
  Requires-Dist: ibis-framework[impala]<13.0.0,>=10.0.0; extra == "impala"
92
+ Requires-Dist: packaging<27.0,>=21.3; extra == "impala"
86
93
  Provides-Extra: dbml
87
94
  Requires-Dist: pydbml>=1.1.1; extra == "dbml"
88
95
  Provides-Extra: duckdb
@@ -112,7 +119,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
112
119
  Requires-Dist: pymssql==2.3.13; extra == "dev"
113
120
  Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
114
121
  Requires-Dist: mysql-connector-python<9.7.0,>=8.0.30; extra == "dev"
115
- Requires-Dist: ruff==0.15.21; extra == "dev"
122
+ Requires-Dist: ruff==0.15.22; extra == "dev"
116
123
  Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2; extra == "dev"
117
124
  Requires-Dist: trino==0.338.0; extra == "dev"
118
125
  Dynamic: license-file
@@ -1,4 +1,4 @@
1
- typer<0.27,>=0.18.0
1
+ typer<0.28,>=0.18.0
2
2
  click<9.0.0,>=8.1.0
3
3
  pydantic<2.14.0,>=2.8.2
4
4
  pyyaml~=6.0.1
@@ -28,6 +28,7 @@ uvicorn<0.52.0,>=0.44.0
28
28
 
29
29
  [athena]
30
30
  ibis-framework[athena]<13.0.0,>=10.0.0
31
+ packaging<27.0,>=21.3
31
32
 
32
33
  [avro]
33
34
  avro==1.12.1
@@ -47,7 +48,7 @@ pandas>=2.0.0
47
48
  [databricks]
48
49
  ibis-framework[databricks,pyspark]<13.0.0,>=10.0.0
49
50
  databricks-sql-connector<4.4.0,>=3.7.0
50
- databricks-sdk<0.121.0
51
+ databricks-sdk<0.122.0
51
52
  pyspark<5.0.0,>=3.5.0
52
53
 
53
54
  [dbml]
@@ -66,7 +67,7 @@ pytest-xdist
66
67
  pymssql==2.3.13
67
68
  psycopg2-binary<3.0,>=2.9
68
69
  mysql-connector-python<9.7.0,>=8.0.30
69
- ruff==0.15.21
70
+ ruff==0.15.22
70
71
  testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.2
71
72
  trino==0.338.0
72
73
 
@@ -86,6 +87,7 @@ pyiceberg==0.11.1
86
87
 
87
88
  [impala]
88
89
  ibis-framework[impala]<13.0.0,>=10.0.0
90
+ packaging<27.0,>=21.3
89
91
 
90
92
  [kafka]
91
93
  datacontract-cli[avro]
@@ -97,6 +99,7 @@ datacontract-cli[duckdb]
97
99
 
98
100
  [oracle]
99
101
  ibis-framework[oracle]<13.0.0,>=10.0.0
102
+ packaging<27.0,>=21.3
100
103
 
101
104
  [parquet]
102
105
  pyarrow>=18.1.0
@@ -104,6 +107,7 @@ pyarrow>=18.1.0
104
107
  [postgres]
105
108
  ibis-framework[postgres]<13.0.0,>=10.0.0
106
109
  psycopg[binary]<4.0,>=3.1
110
+ packaging<27.0,>=21.3
107
111
 
108
112
  [protobuf]
109
113
  proto-schema-parser<3.0,>=1.0
@@ -114,6 +118,7 @@ rdflib==7.6.0
114
118
  [redshift]
115
119
  ibis-framework[postgres]<13.0.0,>=10.0.0
116
120
  psycopg[binary]<4.0,>=3.1
121
+ packaging<27.0,>=21.3
117
122
 
118
123
  [s3]
119
124
  s3fs<2027.0.0,>=2025.2.0
@@ -121,11 +126,13 @@ duckdb-extension-httpfs<1.6.0,>=1.5.0
121
126
  duckdb-extension-aws<1.6.0,>=1.5.0
122
127
 
123
128
  [snowflake]
124
- snowflake-connector-python[pandas]<4.7,>=3.6
129
+ snowflake-connector-python[pandas]<4.8,>=3.6
125
130
  ibis-framework[snowflake]<13.0.0,>=10.0.0
126
131
 
127
132
  [sqlserver]
128
133
  ibis-framework[mssql]<13.0.0,>=10.0.0
134
+ packaging<27.0,>=21.3
129
135
 
130
136
  [trino]
131
137
  ibis-framework[trino]<13.0.0,>=10.0.0
138
+ packaging<27.0,>=21.3
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "datacontract-cli"
3
- version = "1.0.13"
3
+ version = "1.0.14"
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"
@@ -15,7 +15,7 @@ classifiers = [
15
15
  ]
16
16
  requires-python = ">=3.10,<3.15"
17
17
  dependencies = [
18
- "typer>=0.18.0,<0.27",
18
+ "typer>=0.18.0,<0.28",
19
19
  "click>=8.1.0,<9.0.0",
20
20
  "pydantic>=2.8.2,<2.14.0",
21
21
  "pyyaml~=6.0.1",
@@ -59,7 +59,7 @@ excel = [
59
59
  databricks = [
60
60
  "ibis-framework[databricks,pyspark]>=10.0.0,<13.0.0",
61
61
  "databricks-sql-connector>=3.7.0,<4.4.0",
62
- "databricks-sdk<0.121.0",
62
+ "databricks-sdk<0.122.0",
63
63
  # Not capped to Spark 3.5.x like older builds were: the databricks path uses a
64
64
  # caller-provided Spark session (or the databricks SQL connector) and never
65
65
  # loads the Kafka/Avro connector jars, so it isn't tied to a Scala/Spark line.
@@ -93,6 +93,8 @@ postgres = [
93
93
  # psycopg's binary wheels bundle libpq, so the extra works without
94
94
  # PostgreSQL client libraries installed on the system.
95
95
  "psycopg[binary]>=3.1,<4.0",
96
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
97
+ "packaging>=21.3,<27.0",
96
98
  ]
97
99
 
98
100
  redshift = [
@@ -101,6 +103,8 @@ redshift = [
101
103
  # psycopg's binary wheels bundle libpq, so the extra works without
102
104
  # PostgreSQL client libraries installed on the system.
103
105
  "psycopg[binary]>=3.1,<4.0",
106
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
107
+ "packaging>=21.3,<27.0",
104
108
  ]
105
109
 
106
110
  # DuckDB extension wheels are bundled for air-gapped installs. The 1.5.x line
@@ -125,28 +129,38 @@ azure = [
125
129
  ]
126
130
 
127
131
  snowflake = [
128
- "snowflake-connector-python[pandas]>=3.6,<4.7",
132
+ "snowflake-connector-python[pandas]>=3.6,<4.8",
129
133
  "ibis-framework[snowflake]>=10.0.0,<13.0.0"
130
134
  ]
131
135
 
132
136
  sqlserver = [
133
- "ibis-framework[mssql]>=10.0.0,<13.0.0"
137
+ "ibis-framework[mssql]>=10.0.0,<13.0.0",
138
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
139
+ "packaging>=21.3,<27.0",
134
140
  ]
135
141
 
136
142
  oracle = [
137
- "ibis-framework[oracle]>=10.0.0,<13.0.0"
143
+ "ibis-framework[oracle]>=10.0.0,<13.0.0",
144
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
145
+ "packaging>=21.3,<27.0",
138
146
  ]
139
147
 
140
148
  athena = [
141
- "ibis-framework[athena]>=10.0.0,<13.0.0"
149
+ "ibis-framework[athena]>=10.0.0,<13.0.0",
150
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
151
+ "packaging>=21.3,<27.0",
142
152
  ]
143
153
 
144
154
  trino = [
145
- "ibis-framework[trino]>=10.0.0,<13.0.0"
155
+ "ibis-framework[trino]>=10.0.0,<13.0.0",
156
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
157
+ "packaging>=21.3,<27.0",
146
158
  ]
147
159
 
148
160
  impala = [
149
- "ibis-framework[impala]>=10.0.0,<13.0.0"
161
+ "ibis-framework[impala]>=10.0.0,<13.0.0",
162
+ # ibis loads its datafusion compiler (needs packaging) but omits it from this extra.
163
+ "packaging>=21.3,<27.0",
150
164
  ]
151
165
 
152
166
  dbml = [
@@ -200,7 +214,7 @@ dev = [
200
214
  # psycopg v3 and DuckDB's mysql extension respectively).
201
215
  "psycopg2-binary>=2.9,<3.0",
202
216
  "mysql-connector-python>=8.0.30,<9.7.0",
203
- "ruff==0.15.21",
217
+ "ruff==0.15.22",
204
218
  "testcontainers[minio,postgres,kafka,mssql,mysql]==4.14.2",
205
219
  "trino==0.338.0",
206
220
  ]
@@ -684,6 +684,32 @@ def test_singular_tests_skipped_when_query_has_no_bound():
684
684
  assert any("no `mustBe*` bound" in log.message for log in run.logs)
685
685
 
686
686
 
687
+ def test_singular_query_resolves_object_and_property_placeholders():
688
+ """ODCS `{object}`/`{property}` placeholders in a custom `quality.query` resolve to the dbt
689
+ `ref()` and column name so the generated singular test compiles (issue #1397)."""
690
+ run = Run.create_run()
691
+ qualities = [
692
+ DataQuality(
693
+ query="SELECT COUNT(*) FROM {object} WHERE {property} < 0",
694
+ mustBe=0,
695
+ name="positive",
696
+ )
697
+ ]
698
+ out = _singular_tests_for_qualities(qualities, "c", "1.0.0", "MY_TABLE", run, field="my_column")
699
+ assert len(out) == 1
700
+ assert "SELECT COUNT(*) FROM {{ ref('MY_TABLE') }} WHERE my_column < 0" in out[0].sql
701
+ assert "{object}" not in out[0].sql
702
+ assert "{property}" not in out[0].sql
703
+
704
+
705
+ def test_singular_query_placeholder_resolves_versioned_ref():
706
+ """On a versioned model, `{object}` resolves to a version-pinned `ref()`."""
707
+ run = Run.create_run()
708
+ qualities = [DataQuality(query="SELECT COUNT(*) FROM {model}", mustBe=0, name="rc")]
709
+ out = _singular_tests_for_qualities(qualities, "c", "1.0.0", "MY_TABLE", run, model_version="2")
710
+ assert "{{ ref('MY_TABLE', version=2) }}" in out[0].sql
711
+
712
+
687
713
  def test_generate_outputs_warns_on_unsupported_model_qualities():
688
714
  """Model-level qualities that can't map to a test are skipped with a warning — not dropped
689
715
  silently or crashed on: a `rowCount` with no bound, and a non-`rowCount` metric with no query."""
@@ -1,9 +1,11 @@
1
+ import pytest
1
2
  import yaml
2
3
  from open_data_contract_standard.model import OpenDataContractStandard
3
4
  from typer.testing import CliRunner
4
5
 
5
6
  from datacontract.cli import app
6
7
  from datacontract.export.protobuf_exporter import to_protobuf
8
+ from datacontract.model.exceptions import DataContractException
7
9
 
8
10
  # logging.basicConfig(level=logging.DEBUG, force=True)
9
11
 
@@ -77,6 +79,14 @@ schema:
77
79
  - name: user
78
80
  logicalType: string
79
81
  description: Field user
82
+ - name: sub_review
83
+ description: Details of sub review.
84
+ required: False
85
+ logicalType: object
86
+ properties:
87
+ - name: comment
88
+ logicalType: string
89
+ description: Field comment
80
90
  """
81
91
  data_contract = OpenDataContractStandard(**yaml.safe_load(odcs_yaml))
82
92
 
@@ -117,16 +127,64 @@ message Product {
117
127
 
118
128
  // Details of Review.
119
129
  message Review {
130
+ // Details of sub review.
131
+ message SubReview {
132
+ // Field comment
133
+ string comment = 1;
134
+ }
135
+
120
136
  // Field comment
121
137
  string comment = 1;
122
138
  // Field rating
123
139
  int32 rating = 2;
124
140
  // Field user
125
141
  string user = 3;
142
+ // Details of sub review.
143
+ optional SubReview sub_review = 4;
126
144
  }
127
145
 
128
-
129
146
  """.strip()
130
147
  result = to_protobuf(data_contract).strip()
131
148
 
132
149
  assert result == expected_protobuf
150
+
151
+
152
+ def test_to_protobuf_custom_package_name():
153
+ odcs_yaml = """
154
+ kind: DataContract
155
+ apiVersion: v3.1.0
156
+ id: test_protobuf
157
+ customProperties:
158
+ - property: protoPackageName
159
+ value: com.example.product
160
+ schema:
161
+ - name: Product
162
+ properties:
163
+ - name: id
164
+ logicalType: string
165
+ """
166
+ data_contract = OpenDataContractStandard(**yaml.safe_load(odcs_yaml))
167
+
168
+ result = to_protobuf(data_contract)
169
+
170
+ assert "package com.example.product;\n" in result
171
+
172
+
173
+ def test_to_protobuf_invalid_package_name():
174
+ odcs_yaml = """
175
+ kind: DataContract
176
+ apiVersion: v3.1.0
177
+ id: test_protobuf
178
+ customProperties:
179
+ - property: protoPackageName
180
+ value: "123 not a package!"
181
+ schema:
182
+ - name: Product
183
+ properties:
184
+ - name: id
185
+ logicalType: string
186
+ """
187
+ data_contract = OpenDataContractStandard(**yaml.safe_load(odcs_yaml))
188
+
189
+ with pytest.raises(DataContractException):
190
+ to_protobuf(data_contract)