datacontract-cli 1.1.0__tar.gz → 1.1.1__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 (456) hide show
  1. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/MANIFEST.in +1 -0
  2. {datacontract_cli-1.1.0/datacontract_cli.egg-info → datacontract_cli-1.1.1}/PKG-INFO +6 -3
  3. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/README.md +2 -0
  4. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/api.py +307 -49
  5. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_api.py +1 -1
  6. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_ci.py +8 -0
  7. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_export.py +1 -1
  8. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_import.py +20 -0
  9. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_test.py +55 -9
  10. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/data_contract.py +3 -0
  11. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/check_spec.py +16 -0
  12. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/create_checks.py +4 -0
  13. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/data_contract_test.py +12 -1
  14. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_azure_blob_file.py +1 -1
  15. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/connect.py +6 -0
  16. datacontract_cli-1.1.1/datacontract/engines/ibis/connections/databricks_patch.py +142 -0
  17. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/ibis_check_execute.py +39 -30
  18. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/excel_exporter.py +13 -6
  19. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/exporter.py +2 -0
  20. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/pydantic_exporter.py +7 -2
  21. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sodacl_check_builder.py +16 -13
  22. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sql_type_converter.py +9 -2
  23. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/importer.py +1 -0
  24. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/importer_factory.py +5 -0
  25. datacontract_cli-1.1.1/datacontract/imports/pydantic_importer.py +454 -0
  26. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/unity_importer.py +0 -1
  27. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/dbt_sync.py +1 -1
  28. datacontract_cli-1.1.1/datacontract/model/changelog.py +50 -0
  29. datacontract_cli-1.1.1/datacontract/model/run.py +258 -0
  30. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/ci_output.py +2 -1
  31. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/junit_test_results.py +10 -3
  32. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/test_results_writer.py +7 -3
  33. datacontract_cli-1.1.1/datacontract/templates/excel/odcs-template.xlsx +0 -0
  34. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1/datacontract_cli.egg-info}/PKG-INFO +6 -3
  35. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/SOURCES.txt +8 -0
  36. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/requires.txt +3 -2
  37. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/pyproject.toml +4 -3
  38. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_api.py +47 -0
  39. datacontract_cli-1.1.1/tests/test_api_openapi.py +123 -0
  40. datacontract_cli-1.1.1/tests/test_create_checks_sql_placeholders.py +44 -0
  41. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract_checks.py +41 -0
  42. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dbt_sync.py +1 -1
  43. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_commands.py +6 -16
  44. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_ordering.py +4 -0
  45. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_excel.py +61 -0
  46. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_pydantic.py +22 -0
  47. datacontract_cli-1.1.1/tests/test_import_pydantic_model.py +147 -0
  48. datacontract_cli-1.1.1/tests/test_run_check_deprecated_fields.py +65 -0
  49. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_sql_type_converter_physicaltype.py +19 -1
  50. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_api.py +27 -0
  51. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_azure_blob_file.py +1 -1
  52. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_checks_filter.py +18 -0
  53. datacontract_cli-1.1.1/tests/test_test_databricks.py +144 -0
  54. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_failed_samples.py +8 -8
  55. datacontract_cli-1.1.1/tests/test_test_metadata_only.py +232 -0
  56. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_id_and_tag_filter.py +3 -3
  57. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_row_filter.py +4 -0
  58. datacontract_cli-1.1.0/datacontract/model/changelog.py +0 -29
  59. datacontract_cli-1.1.0/datacontract/model/run.py +0 -131
  60. datacontract_cli-1.1.0/tests/test_test_databricks.py +0 -53
  61. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/LICENSE +0 -0
  62. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/__init__.py +0 -0
  63. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/catalog/catalog.py +0 -0
  64. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/__init__.py +0 -0
  65. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/changelog.py +0 -0
  66. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/changelog/normalize.py +0 -0
  67. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/cli.py +0 -0
  68. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_catalog.py +0 -0
  69. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_changelog.py +0 -0
  70. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_dbt.py +0 -0
  71. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_edit.py +0 -0
  72. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_init.py +0 -0
  73. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_lint.py +0 -0
  74. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/command_publish.py +0 -0
  75. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/__init__.py +0 -0
  76. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/cli_context.py +0 -0
  77. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/config/settings.py +0 -0
  78. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/VERSION +0 -0
  79. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/abap-Bs8kvjsq.js +0 -0
  80. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/apex-Dspwrl5m.js +0 -0
  81. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/assets/editor.worker-4.7.0.js +0 -0
  82. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/assets/yaml.worker-4.7.0.js +0 -0
  83. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/azcli-k1BiOau1.js +0 -0
  84. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/bat-BIP72KWc.js +0 -0
  85. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/bicep-VhQeYhS3.js +0 -0
  86. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cameligo-DnuAXtHg.js +0 -0
  87. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/clojure-BAuDPsal.js +0 -0
  88. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/coffee-BV06qSnj.js +0 -0
  89. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cpp-Cz8Jeyrf.js +0 -0
  90. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/csharp-F6hhlXFb.js +0 -0
  91. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/csp-KzlEHCyI.js +0 -0
  92. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/css-e4FKntZ3.js +0 -0
  93. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cssMode-BNkTa2xp.js +0 -0
  94. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/cypher-CpvDGKRr.js +0 -0
  95. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/dart-DdHeFWR0.js +0 -0
  96. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/datacontract-editor.css +0 -0
  97. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/datacontract-editor.es.js +0 -0
  98. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/dockerfile-aoNXDcio.js +0 -0
  99. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ecl-C4Q0DYuA.js +0 -0
  100. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/elixir-C9X42b0T.js +0 -0
  101. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/flow9-Bff42pfB.js +0 -0
  102. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/freemarker2-Dyfzmb5A.js +0 -0
  103. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/fsharp-C6vPAsHG.js +0 -0
  104. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/go-DEr8zx9f.js +0 -0
  105. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/graphql-BiNBBRFh.js +0 -0
  106. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/handlebars-BtDNI-uC.js +0 -0
  107. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/hcl-2T9lKuFg.js +0 -0
  108. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/html-Cn4TGw_o.js +0 -0
  109. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/htmlMode-Bf84vbo2.js +0 -0
  110. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/index.html +0 -0
  111. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ini-CZGtssYM.js +0 -0
  112. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/java-B260NeH3.js +0 -0
  113. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/javascript-B86Kac07.js +0 -0
  114. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/jsonMode-Ckgg5lAE.js +0 -0
  115. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/julia-kuNLM9c5.js +0 -0
  116. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/kotlin-Bz6kAefA.js +0 -0
  117. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/less-AZUtS89I.js +0 -0
  118. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/lexon-BcmgnyRb.js +0 -0
  119. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/liquid-D0NPwuu_.js +0 -0
  120. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/logo_fuchsia_v2.svg +0 -0
  121. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/lua-Dz1RbATg.js +0 -0
  122. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/m3-CIMooLFn.js +0 -0
  123. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/markdown-C1BsCK9P.js +0 -0
  124. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mdx-QFRSBtVQ.js +0 -0
  125. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mips-BovsnfLQ.js +0 -0
  126. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/monaco-4.7.0.js +0 -0
  127. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/msdax-CiRB2ZB-.js +0 -0
  128. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/mysql-BwdpPE19.js +0 -0
  129. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/objective-c-D4nfHfso.js +0 -0
  130. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/odcs.svg +0 -0
  131. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pascal--j5-PYtz.js +0 -0
  132. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pascaligo-C7TcJxNL.js +0 -0
  133. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/perl-BzEWqUb5.js +0 -0
  134. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pgsql-B_KZ0mGX.js +0 -0
  135. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/php-A19QHzQV.js +0 -0
  136. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pla-COeKY1hA.js +0 -0
  137. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/postiats-BfMp7zJL.js +0 -0
  138. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/powerquery-B0TS_5Gb.js +0 -0
  139. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/powershell-5jSbKdYB.js +0 -0
  140. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/protobuf-YgnOutn3.js +0 -0
  141. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/pug-DLej6kn5.js +0 -0
  142. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/python-C8RW9B6A.js +0 -0
  143. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/qsharp-AhjqtSHB.js +0 -0
  144. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/r-D-F4P80w.js +0 -0
  145. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/razor-CLZqdY_r.js +0 -0
  146. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/redis-hwwIlMnV.js +0 -0
  147. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/redshift-Bcm_kjEG.js +0 -0
  148. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/restructuredtext-CrdzfPP-.js +0 -0
  149. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/ruby-QC2UNm1s.js +0 -0
  150. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/rust-5aqiQ3L5.js +0 -0
  151. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sb-B1g1ZfLJ.js +0 -0
  152. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scala-C2U4R5Gb.js +0 -0
  153. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scheme-DeFRbslr.js +0 -0
  154. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/scss-RSTCiCmI.js +0 -0
  155. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/shell-BpF-iNu8.js +0 -0
  156. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/solidity-C00r2mbQ.js +0 -0
  157. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sophia-DVW5ZKDB.js +0 -0
  158. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sparql-B0nmpxeX.js +0 -0
  159. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/sql-CJwKPERn.js +0 -0
  160. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/st-DPlKG5DT.js +0 -0
  161. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/swift-YZBAbVHV.js +0 -0
  162. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/systemverilog-CDQSaH63.js +0 -0
  163. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/tcl-Dlu8sp6Q.js +0 -0
  164. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/tsMode-yleMwhPq.js +0 -0
  165. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/twig-C5TO7-kw.js +0 -0
  166. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/typescript-CJBeebKU.js +0 -0
  167. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/typespec-BsmjDEu7.js +0 -0
  168. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/vb-ChHvIDrk.js +0 -0
  169. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/wgsl-XEp1ju8c.js +0 -0
  170. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/xml-vC-NMVX1.js +0 -0
  171. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/editor_assets/yaml-Dlf2VF-T.js +0 -0
  172. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/__init__.py +0 -0
  173. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/__init__.py +0 -0
  174. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/check_filter.py +0 -0
  175. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/dimensions.py +0 -0
  176. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/physical_type_match.py +0 -0
  177. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/checks/type_normalize.py +0 -0
  178. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  179. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  180. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  181. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  182. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/__init__.py +0 -0
  183. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/__init__.py +0 -0
  184. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/aws_credentials.py +0 -0
  185. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/duckdb_connection.py +0 -0
  186. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/kafka.py +0 -0
  187. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/oracle_patch.py +0 -0
  188. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/redshift_credentials.py +0 -0
  189. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/connections/redshift_patch.py +0 -0
  190. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/dtype_category.py +0 -0
  191. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/native_type.py +0 -0
  192. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/engines/ibis/snowflake_structured_types.py +0 -0
  193. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/__init__.py +0 -0
  194. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/avro_exporter.py +0 -0
  195. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/avro_idl_exporter.py +0 -0
  196. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/bigquery_exporter.py +0 -0
  197. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/custom_exporter.py +0 -0
  198. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/data_caterer_exporter.py +0 -0
  199. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dbml_exporter.py +0 -0
  200. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dbt_exporter.py +0 -0
  201. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dcs_exporter.py +0 -0
  202. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/dqx_exporter.py +0 -0
  203. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/duckdb_type_converter.py +0 -0
  204. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/exporter_factory.py +0 -0
  205. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/go_exporter.py +0 -0
  206. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/great_expectations_exporter.py +0 -0
  207. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/html_exporter.py +0 -0
  208. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/iceberg_exporter.py +0 -0
  209. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/jsonschema_exporter.py +0 -0
  210. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/markdown_exporter.py +0 -0
  211. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/mermaid_exporter.py +0 -0
  212. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/odcs_export_helper.py +0 -0
  213. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/odcs_v3_exporter.py +0 -0
  214. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/pandas_type_converter.py +0 -0
  215. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/protobuf_exporter.py +0 -0
  216. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/rdf_exporter.py +0 -0
  217. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sodacl_exporter.py +0 -0
  218. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/spark_exporter.py +0 -0
  219. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sql_exporter.py +0 -0
  220. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/export/sqlalchemy_exporter.py +0 -0
  221. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/athena_importer.py +0 -0
  222. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/avro_importer.py +0 -0
  223. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/bigquery_importer.py +0 -0
  224. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/csv_importer.py +0 -0
  225. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dbml_importer.py +0 -0
  226. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dbt_importer.py +0 -0
  227. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/dcs_importer.py +0 -0
  228. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/excel_importer.py +0 -0
  229. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/glue_importer.py +0 -0
  230. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/iceberg_importer.py +0 -0
  231. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/json_importer.py +0 -0
  232. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/jsonschema_importer.py +0 -0
  233. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/mysql_importer.py +0 -0
  234. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/object_storage_importer.py +0 -0
  235. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/odcs_helper.py +0 -0
  236. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/odcs_importer.py +0 -0
  237. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/oracle_importer.py +0 -0
  238. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/parquet_importer.py +0 -0
  239. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/postgres_importer.py +0 -0
  240. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/powerbi_importer.py +0 -0
  241. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/protobuf_importer.py +0 -0
  242. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/redshift_importer.py +0 -0
  243. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/snowflake_importer.py +0 -0
  244. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/spark_importer.py +0 -0
  245. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/spark_type_json.py +0 -0
  246. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/sql_importer.py +0 -0
  247. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/sqlserver_importer.py +0 -0
  248. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/imports/trino_importer.py +0 -0
  249. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/init/init_template.py +0 -0
  250. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/dbt_test_mapping.py +0 -0
  251. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/integration/entropy_data.py +0 -0
  252. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/files.py +0 -0
  253. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/resolve.py +0 -0
  254. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/resources.py +0 -0
  255. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/s3.py +0 -0
  256. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/schema.py +0 -0
  257. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/lint/urls.py +0 -0
  258. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/exceptions.py +0 -0
  259. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/odcs.py +0 -0
  260. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/model/server.py +0 -0
  261. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/__init__.py +0 -0
  262. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/json_test_results.py +0 -0
  263. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/output_format.py +0 -0
  264. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/output/text_changelog_results.py +0 -0
  265. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/py.typed +0 -0
  266. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  267. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  268. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  269. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  270. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  271. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  272. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  273. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  274. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  275. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  276. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/datacontract.html +0 -0
  277. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/datacontract_odcs.html +0 -0
  278. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/index.html +0 -0
  279. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/authoritative_definitions.html +0 -0
  280. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/schema.html +0 -0
  281. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/server.html +0 -0
  282. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/macros/support.html +0 -0
  283. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_information.html +0 -0
  284. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  285. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/datacontract_terms.html +0 -0
  286. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/definition.html +0 -0
  287. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/example.html +0 -0
  288. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/model_field.html +0 -0
  289. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/quality.html +0 -0
  290. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials/server.html +0 -0
  291. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/custom_properties.html +0 -0
  292. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/diagram.html +0 -0
  293. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/dialog_yaml.html +0 -0
  294. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/footer.html +0 -0
  295. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/fundamentals.html +0 -0
  296. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/header.html +0 -0
  297. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/pricing.html +0 -0
  298. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/roles.html +0 -0
  299. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/schema.html +0 -0
  300. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/servers.html +0 -0
  301. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/sla.html +0 -0
  302. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/support.html +0 -0
  303. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/team.html +0 -0
  304. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/term_of_use.html +0 -0
  305. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/partials_odcs/title.html +0 -0
  306. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract/templates/style/output.css +0 -0
  307. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  308. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/entry_points.txt +0 -0
  309. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/datacontract_cli.egg-info/top_level.txt +0 -0
  310. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/setup.cfg +0 -0
  311. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_catalog.py +0 -0
  312. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog.py +0 -0
  313. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_engine.py +0 -0
  314. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_normalize.py +0 -0
  315. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_changelog_output_text.py +0 -0
  316. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ci_output.py +0 -0
  317. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_cli.py +0 -0
  318. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config.py +0 -0
  319. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_file.py +0 -0
  320. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_require.py +0 -0
  321. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_config_threading.py +0 -0
  322. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_athena.py +0 -0
  323. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_bigquery.py +0 -0
  324. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_databricks.py +0 -0
  325. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_impala.py +0 -0
  326. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_mysql.py +0 -0
  327. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_oracle.py +0 -0
  328. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_postgres.py +0 -0
  329. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_redshift.py +0 -0
  330. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_s3_credentials.py +0 -0
  331. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_snowflake.py +0 -0
  332. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_sqlserver.py +0 -0
  333. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_connect_trino.py +0 -0
  334. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_nested_type.py +0 -0
  335. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_physical_type.py +0 -0
  336. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_create_checks_primary_key.py +0 -0
  337. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract.py +0 -0
  338. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_data_contract_specification.py +0 -0
  339. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dbt_test_mapping.py +0 -0
  340. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_description_linter.py +0 -0
  341. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_docs_config_options.py +0 -0
  342. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_download_datacontract_file.py +0 -0
  343. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_dtype_category.py +0 -0
  344. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_duckdb_json.py +0 -0
  345. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_edit.py +0 -0
  346. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_avro.py +0 -0
  347. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_avro_idl.py +0 -0
  348. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_bigquery.py +0 -0
  349. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_complex_data_contract.py +0 -0
  350. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom.py +0 -0
  351. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom_exporter.py +0 -0
  352. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_custom_model.py +0 -0
  353. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_data_caterer.py +0 -0
  354. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbml.py +0 -0
  355. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_models.py +0 -0
  356. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_sources.py +0 -0
  357. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dbt_staging_sql.py +0 -0
  358. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_dqx.py +0 -0
  359. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_go.py +0 -0
  360. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_great_expectations.py +0 -0
  361. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_html.py +0 -0
  362. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_iceberg.py +0 -0
  363. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_jsonschema.py +0 -0
  364. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_markdown.py +0 -0
  365. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_mermaid.py +0 -0
  366. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_odcs_v3.py +0 -0
  367. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_protobuf.py +0 -0
  368. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_rdf.py +0 -0
  369. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sodacl.py +0 -0
  370. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_spark.py +0 -0
  371. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql.py +0 -0
  372. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql_clickhouse.py +0 -0
  373. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sql_query.py +0 -0
  374. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_export_sqlalchemy.py +0 -0
  375. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_mssql_pattern.py +0 -0
  376. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_mssql_schema.py +0 -0
  377. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_ibis_oracle_schema.py +0 -0
  378. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_athena.py +0 -0
  379. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_avro.py +0 -0
  380. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_bigquery.py +0 -0
  381. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_csv.py +0 -0
  382. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_dbml.py +0 -0
  383. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_dbt.py +0 -0
  384. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_excel.py +0 -0
  385. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_glue.py +0 -0
  386. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_iceberg.py +0 -0
  387. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_json.py +0 -0
  388. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_jsonschema.py +0 -0
  389. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_mysql.py +0 -0
  390. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_object_storage.py +0 -0
  391. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_odcs_v3.py +0 -0
  392. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_oracle.py +0 -0
  393. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_parquet.py +0 -0
  394. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_postgres.py +0 -0
  395. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_powerbi.py +0 -0
  396. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_protobuf.py +0 -0
  397. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_redshift.py +0 -0
  398. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_snowflake.py +0 -0
  399. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_spark_type_json.py +0 -0
  400. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_oracle.py +0 -0
  401. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_postgres.py +0 -0
  402. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_snowflake.py +0 -0
  403. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sql_sqlserver.py +0 -0
  404. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_sqlserver.py +0 -0
  405. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_trino.py +0 -0
  406. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_import_unity_file.py +0 -0
  407. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_install_extras.py +0 -0
  408. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_integration_entropydata.py +0 -0
  409. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_lint.py +0 -0
  410. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_native_type_schema_scope.py +0 -0
  411. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_oracle_patch.py +0 -0
  412. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_physical_type_match.py +0 -0
  413. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_redshift_credentials.py +0 -0
  414. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_redshift_patch.py +0 -0
  415. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_resolve.py +0 -0
  416. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_resolve_definitions.py +0 -0
  417. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_roundtrip_jsonschema.py +0 -0
  418. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_server_type_mssql.py +0 -0
  419. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_snowflake_structured_types.py +0 -0
  420. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_athena_iceberg.py +0 -0
  421. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_azure_remote.py +0 -0
  422. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_bigquery.py +0 -0
  423. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_delta.py +0 -0
  424. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_diagnostics.py +0 -0
  425. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_dimension_filter.py +0 -0
  426. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_gcs_csv_remote.py +0 -0
  427. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_gcs_json_remote.py +0 -0
  428. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka.py +0 -0
  429. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka_decoding.py +0 -0
  430. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_kafka_remote.py +0 -0
  431. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_local_json.py +0 -0
  432. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_local_json_nd.py +0 -0
  433. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_mysql.py +0 -0
  434. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_oracle.py +0 -0
  435. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_oracle_xe.py +0 -0
  436. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_output_json.py +0 -0
  437. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_output_junit.py +0 -0
  438. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_parquet.py +0 -0
  439. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_postgres.py +0 -0
  440. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality.py +0 -0
  441. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_local_fallback.py +0 -0
  442. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_quality_percent_severity.py +0 -0
  443. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_redshift.py +0 -0
  444. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_csv.py +0 -0
  445. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_delta.py +0 -0
  446. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json.py +0 -0
  447. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_complex.py +0 -0
  448. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_multiple_models.py +0 -0
  449. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_s3_json_remote.py +0 -0
  450. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_schema_evolution.py +0 -0
  451. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_server_not_found.py +0 -0
  452. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_snowflake.py +0 -0
  453. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_soda_connection_error.py +0 -0
  454. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_sqlserver.py +0 -0
  455. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_test_trino.py +0 -0
  456. {datacontract_cli-1.1.0 → datacontract_cli-1.1.1}/tests/test_type_normalize.py +0 -0
@@ -1,4 +1,5 @@
1
1
  include datacontract/templates/style/output.css
2
+ include datacontract/templates/excel/odcs-template.xlsx
2
3
  recursive-include datacontract/templates/ **/*.html
3
4
  recursive-include datacontract/schemas/ **/*.json **/*.yaml
4
5
  recursive-include datacontract/editor_assets/ *
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 1.1.0
3
+ Version: 1.1.1
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@entropy-data.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@entropy-data.com>
6
6
  License-Expression: MIT
@@ -67,7 +67,7 @@ Requires-Dist: rich>=12.4.4; extra == "dataframe"
67
67
  Provides-Extra: databricks
68
68
  Requires-Dist: ibis-framework[databricks]<13.0.0,>=10.0.0; extra == "databricks"
69
69
  Requires-Dist: databricks-sql-connector<4.5.0,>=3.7.0; extra == "databricks"
70
- Requires-Dist: databricks-sdk<0.123.0; extra == "databricks"
70
+ Requires-Dist: databricks-sdk<0.126.0; extra == "databricks"
71
71
  Requires-Dist: packaging<27.0,>=21.3; extra == "databricks"
72
72
  Provides-Extra: databricks-runtime
73
73
  Requires-Dist: datacontract-cli[databricks]; extra == "databricks-runtime"
@@ -139,6 +139,7 @@ Requires-Dist: httpx==0.28.1; extra == "dev"
139
139
  Requires-Dist: kafka-python; extra == "dev"
140
140
  Requires-Dist: minio==7.2.20; extra == "dev"
141
141
  Requires-Dist: moto==5.2.2; extra == "dev"
142
+ Requires-Dist: openapi-spec-validator<0.10,>=0.7; extra == "dev"
142
143
  Requires-Dist: pandas>=2.1.0; extra == "dev"
143
144
  Requires-Dist: pre-commit<4.7.0,>=3.7.1; extra == "dev"
144
145
  Requires-Dist: pytest; extra == "dev"
@@ -146,7 +147,7 @@ Requires-Dist: pytest-xdist; extra == "dev"
146
147
  Requires-Dist: pymssql==2.3.13; extra == "dev"
147
148
  Requires-Dist: psycopg2-binary<3.0,>=2.9; extra == "dev"
148
149
  Requires-Dist: mysql-connector-python<26.8.0,>=8.0.30; extra == "dev"
149
- Requires-Dist: ruff==0.16.1; extra == "dev"
150
+ Requires-Dist: ruff==0.16.2; extra == "dev"
150
151
  Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.15.0; extra == "dev"
151
152
  Requires-Dist: trino==0.338.0; extra == "dev"
152
153
  Dynamic: license-file
@@ -399,6 +400,8 @@ alias datacontract='docker run --rm -v "${PWD}:/home/datacontract" datacontract/
399
400
 
400
401
  _Note:_ The output of Docker command line messages is limited to 80 columns and may include line breaks. Don't pipe docker output to files if you want to export code. Use the `--output` option instead.
401
402
 
403
+ Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signing/overview/) keyless signing. See [Verifying the image](https://docs.datacontract.com/installation#verifying-the-image) to check a signature before you run it.
404
+
402
405
 
403
406
 
404
407
  ## Optional Dependencies (Extras)
@@ -246,6 +246,8 @@ alias datacontract='docker run --rm -v "${PWD}:/home/datacontract" datacontract/
246
246
 
247
247
  _Note:_ The output of Docker command line messages is limited to 80 columns and may include line breaks. Don't pipe docker output to files if you want to export code. Use the `--output` option instead.
248
248
 
249
+ Released images are signed with [cosign](https://docs.sigstore.dev/cosign/signing/overview/) keyless signing. See [Verifying the image](https://docs.datacontract.com/installation#verifying-the-image) to check a signature before you run it.
250
+
249
251
 
250
252
 
251
253
  ## Optional Dependencies (Extras)
@@ -2,21 +2,22 @@ import json
2
2
  import logging
3
3
  import os
4
4
  import tempfile
5
+ from importlib import metadata
5
6
  from typing import Annotated, Optional
6
7
 
7
8
  import pydantic
8
- import typer
9
9
  import yaml
10
10
  from fastapi import Body, Depends, FastAPI, HTTPException, Query, Request, status
11
11
  from fastapi.middleware.cors import CORSMiddleware
12
12
  from fastapi.responses import PlainTextResponse
13
13
  from fastapi.security.api_key import APIKeyHeader
14
- from pydantic import BaseModel, ValidationError
14
+ from pydantic import BaseModel, Field, ValidationError
15
15
 
16
16
  from datacontract.config import Config, known_env_names
17
17
  from datacontract.data_contract import DataContract, ExportFormat
18
+ from datacontract.model.changelog import ChangelogEntry
18
19
  from datacontract.model.exceptions import DataContractException
19
- from datacontract.model.run import Run
20
+ from datacontract.model.run import Check, ResultEnum, Run
20
21
 
21
22
  DATA_CONTRACT_EXAMPLE_PAYLOAD = """apiVersion: v3.1.0
22
23
  kind: DataContract
@@ -225,40 +226,114 @@ def _require_schema_url(schema: str | None) -> str | None:
225
226
  return schema
226
227
 
227
228
 
229
+ def _cli_version() -> str:
230
+ try:
231
+ return metadata.version("datacontract-cli")
232
+ except metadata.PackageNotFoundError:
233
+ return "0.0.0"
234
+
235
+
236
+ API_DESCRIPTION = """
237
+ The Data Contract CLI as a web server. Every endpoint takes an
238
+ [ODCS](https://bitol-io.github.io/open-data-contract-standard/) data contract and runs one of the
239
+ CLI commands against it, so anything `datacontract test|lint|export|changelog` can do on the command
240
+ line can be done over HTTP.
241
+
242
+ The data contract is the request body: `POST` it as `application/yaml` (or as a JSON string) —
243
+ there is no contract storage, every request is self-contained.
244
+
245
+ ## Authentication
246
+
247
+ Authentication is off unless the server was started with the environment variable
248
+ `DATACONTRACT_CLI_API_KEY` set. When it is set, every endpoint requires the header `x-api-key` with
249
+ that value, and answers `401` when the header is missing and `403` when it is wrong.
250
+
251
+ Securing the API is strongly recommended: `POST /test` connects to your data sources, and test
252
+ results may contain sensitive information.
253
+
254
+ ## Connecting to data sources
255
+
256
+ `POST /test` needs credentials for the server described in the contract's `servers` section. Provide
257
+ them either as environment variables when starting the server, or per request as `datacontract-*`
258
+ headers, which are matched case-insensitively and map mechanically to the environment variable names
259
+ (`datacontract-snowflake-password` sets `DATACONTRACT_SNOWFLAKE_PASSWORD` for that request only).
260
+ Per-request headers are never written to the process environment, so one server can serve several
261
+ tenants. Send them over HTTPS only.
262
+
263
+ See [Configuration](https://docs.datacontract.com/configuration) for the full list of options.
264
+ """
265
+
228
266
  app = FastAPI(
229
267
  docs_url="/",
230
268
  title="Data Contract CLI API",
231
- summary="You can use the API to test, export, and lint your data contracts.",
269
+ summary="Test, lint, export, and compare data contracts over HTTP.",
270
+ description=API_DESCRIPTION,
271
+ version=_cli_version(),
232
272
  license_info={
233
273
  "name": "MIT License",
234
274
  "identifier": "MIT",
235
275
  },
236
- contact={"name": "Data Contract CLI", "url": "https://cli.datacontract.com/"},
276
+ contact={
277
+ "name": "Data Contract CLI",
278
+ "url": "https://docs.datacontract.com/",
279
+ },
280
+ # Relative, so the document works for any deployment. A second, absolute entry would
281
+ # show up as a target in the Swagger UI dropdown and invite sending contracts there.
282
+ servers=[{"url": "/", "description": "The server this document was loaded from"}],
237
283
  openapi_tags=[
238
284
  {
239
285
  "name": "test",
286
+ "description": "Run the schema and quality tests of a data contract against the actual data.",
240
287
  "externalDocs": {
241
288
  "description": "Documentation",
242
- "url": "https://cli.datacontract.com/#test",
289
+ "url": "https://docs.datacontract.com/testing/",
243
290
  },
244
291
  },
245
292
  {
246
293
  "name": "lint",
294
+ "description": "Validate that a data contract is syntactically correct and follows the standard.",
247
295
  "externalDocs": {
248
296
  "description": "Documentation",
249
- "url": "https://cli.datacontract.com/#lint",
297
+ "url": "https://docs.datacontract.com/commands/lint",
250
298
  },
251
299
  },
252
300
  {
253
301
  "name": "export",
302
+ "description": "Convert a data contract into another format, such as SQL DDL, Avro, or dbt.",
303
+ "externalDocs": {
304
+ "description": "Documentation",
305
+ "url": "https://docs.datacontract.com/exports/",
306
+ },
307
+ },
308
+ {
309
+ "name": "changelog",
310
+ "description": "Compare two versions of a data contract and list what changed.",
254
311
  "externalDocs": {
255
312
  "description": "Documentation",
256
- "url": "https://cli.datacontract.com/#export",
313
+ "url": "https://docs.datacontract.com/commands/changelog",
257
314
  },
258
315
  },
259
316
  ],
260
317
  )
261
318
 
319
+ _fastapi_openapi = app.openapi
320
+
321
+
322
+ def _openapi_with_external_docs() -> dict:
323
+ """Add the document-level `externalDocs`, which FastAPI has no constructor argument for."""
324
+ schema = _fastapi_openapi()
325
+ schema.setdefault(
326
+ "externalDocs",
327
+ {
328
+ "description": "Data Contract CLI documentation",
329
+ "url": "https://docs.datacontract.com/api",
330
+ },
331
+ )
332
+ return schema
333
+
334
+
335
+ app.openapi = _openapi_with_external_docs
336
+
262
337
  app.add_middleware(
263
338
  CORSMiddleware,
264
339
  allow_origins=["*"],
@@ -268,10 +343,57 @@ app.add_middleware(
268
343
 
269
344
  api_key_header = APIKeyHeader(
270
345
  name="x-api-key",
346
+ description="The secret the server was started with in the environment variable "
347
+ "`DATACONTRACT_CLI_API_KEY`. Only required if that variable is set.",
271
348
  auto_error=False, # this makes authentication optional
272
349
  )
273
350
 
274
351
 
352
+ class ErrorResponse(BaseModel):
353
+ """The body returned for a request that could not be handled."""
354
+
355
+ detail: str = Field(
356
+ description="A human-readable explanation of why the request failed.",
357
+ examples=["Missing API key. Use Header 'x-api-key' to provide the API key."],
358
+ )
359
+
360
+
361
+ class RequestValidationErrorItem(BaseModel):
362
+ """A single violation found while validating the request itself."""
363
+
364
+ loc: list[str | int] = Field(description="The path to the offending part of the request.")
365
+ msg: str = Field(description="What is wrong with it.")
366
+ type: str = Field(description="The machine-readable error type.")
367
+
368
+
369
+ class UnprocessableEntityResponse(BaseModel):
370
+ """The body returned for a request that is well-formed but cannot be processed."""
371
+
372
+ detail: str | list[RequestValidationErrorItem] = Field(
373
+ description="A message explaining why the request was rejected, or — when the request itself "
374
+ "failed validation — one entry per violation.",
375
+ examples=["The schema parameter must be an http:// or https:// URL."],
376
+ )
377
+
378
+
379
+ AUTHENTICATION_RESPONSES: dict[int | str, dict] = {
380
+ 401: {
381
+ "description": "The API key is missing (only when the server runs with DATACONTRACT_CLI_API_KEY set).",
382
+ "model": ErrorResponse,
383
+ "content": {
384
+ "application/json": {
385
+ "example": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."}
386
+ }
387
+ },
388
+ },
389
+ 403: {
390
+ "description": "The provided API key is not correct.",
391
+ "model": ErrorResponse,
392
+ "content": {"application/json": {"example": {"detail": "The provided API key is not correct."}}},
393
+ },
394
+ }
395
+
396
+
275
397
  _CONFIG_HEADER_PREFIX = "datacontract-"
276
398
 
277
399
 
@@ -348,33 +470,40 @@ def check_api_key(api_key_header: str | None):
348
470
  @app.post(
349
471
  "/test",
350
472
  tags=["test"],
351
- summary="Run data contract tests",
473
+ operation_id="testDataContract",
474
+ summary="Run the tests of a data contract",
352
475
  description="""
353
- Run schema and quality tests. Data Contract CLI connects to the data sources configured in the server section.
354
- This usually requires credentials to access the data sources.
355
- Credentials can be provided via environment variables when running the web server, or per request
356
- via datacontract-* headers (case-insensitive), which map to the environment variable names
357
- (e.g. datacontract-snowflake-password sets DATACONTRACT_SNOWFLAKE_PASSWORD for this request only).
358
- POST the data contract YAML as payload.
476
+ Run the schema and quality tests of a data contract against the actual data. The Data Contract CLI
477
+ connects to the data source described by the contract's `servers` section, so this usually requires
478
+ credentials — set them as environment variables when starting the server, or send them per request
479
+ as `datacontract-*` headers (see the API description).
480
+
481
+ `POST` the data contract as `application/yaml`. The response is a test run with one check per
482
+ executed test; `result` is `passed` only if every check passed. Note that a failed test is a
483
+ `200 OK` with `"result": "failed"` — a non-2xx status means the request itself could not be
484
+ handled. A contract that cannot be parsed is reported the same way, as a failed check.
359
485
  """,
486
+ response_description="The test run, with one check per executed test.",
360
487
  responses={
361
- 401: {
362
- "description": "Unauthorized (when an environment variable DATACONTRACT_CLI_API_KEY is configured).",
488
+ **AUTHENTICATION_RESPONSES,
489
+ 400: {
490
+ "description": "A `datacontract-*` header does not name a known configuration option, "
491
+ "or its value is not valid for that option.",
492
+ "model": ErrorResponse,
363
493
  "content": {
364
494
  "application/json": {
365
- "examples": {
366
- "api_key_missing": {
367
- "summary": "API key Missing",
368
- "value": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."},
369
- },
370
- "api_key_wrong": {
371
- "summary": "API key Wrong",
372
- "value": {"detail": "The provided API key is not correct."},
373
- },
495
+ "example": {
496
+ "detail": "Invalid datacontract-* configuration header: "
497
+ "DATACONTRACT_SNOWFLAKE_LOGIN_TIMEOUT: input should be a valid integer"
374
498
  }
375
499
  }
376
500
  },
377
501
  },
502
+ 422: {
503
+ "description": "`filter` and `filters` were both given, or `filters` is not a JSON object "
504
+ "mapping schema name to a SQL predicate.",
505
+ "model": UnprocessableEntityResponse,
506
+ },
378
507
  },
379
508
  response_model_exclude_none=True,
380
509
  response_model_exclude_unset=True,
@@ -442,11 +571,39 @@ async def test(
442
571
  ).test()
443
572
 
444
573
 
574
+ class LintResponse(BaseModel):
575
+ """The outcome of validating a data contract against the schema."""
576
+
577
+ result: ResultEnum = Field(
578
+ description="`passed` if the data contract is valid, otherwise the most severe check result.",
579
+ examples=["passed"],
580
+ )
581
+ checks: list[Check] = Field(
582
+ description="One entry per validation performed. A valid contract yields a single passed check; "
583
+ "an invalid one yields a failed check per schema violation.",
584
+ )
585
+
586
+
445
587
  @app.post(
446
588
  "/lint",
447
589
  tags=["lint"],
448
- summary="Validate that the datacontract.yaml is correctly formatted.",
449
- description="""Validate that the datacontract.yaml is correctly formatted.""",
590
+ operation_id="lintDataContract",
591
+ summary="Validate that a data contract is correctly formatted",
592
+ description="""
593
+ Validate that the data contract is syntactically correct and conforms to the Open Data Contract
594
+ Standard. No data source is contacted, so no credentials are needed.
595
+
596
+ An invalid contract is reported as a `200 OK` with `"result": "failed"` and one check per schema
597
+ violation — not as an error status. A `schema` that is not an `http(s)` URL is rejected with `422`.
598
+ """,
599
+ response_description="The lint result, with one check per validation performed.",
600
+ responses={
601
+ **AUTHENTICATION_RESPONSES,
602
+ 422: {
603
+ "description": "The `schema` parameter is not an `http(s)` URL.",
604
+ "model": UnprocessableEntityResponse,
605
+ },
606
+ },
450
607
  )
451
608
  async def lint(
452
609
  body: Annotated[
@@ -457,43 +614,81 @@ async def lint(
457
614
  examples=[DATA_CONTRACT_EXAMPLE_PAYLOAD],
458
615
  ),
459
616
  ],
617
+ api_key: Annotated[str | None, Depends(api_key_header)] = None,
460
618
  schema: Annotated[
461
619
  str | None,
462
620
  Query(
463
621
  examples=["https://datacontract.com/datacontract.schema.json"],
464
- description="The schema to use for validation. This must be a URL.",
622
+ description="The JSON Schema to validate against, as an `http(s)` URL. "
623
+ "Defaults to the schema for the contract's `apiVersion`.",
465
624
  ),
466
625
  ] = None,
467
626
  all_errors: Annotated[
468
627
  bool,
469
628
  Query(description="Report all JSON Schema validation errors instead of only the first one."),
470
629
  ] = False,
471
- ):
630
+ ) -> LintResponse:
631
+ check_api_key(api_key)
472
632
  data_contract = DataContract(
473
633
  data_contract_str=body, schema_location=_require_schema_url(schema), all_errors=all_errors
474
634
  )
475
635
  lint_result = data_contract.lint()
476
- return {"result": lint_result.result, "checks": lint_result.checks}
636
+ return LintResponse(result=lint_result.result, checks=lint_result.checks)
477
637
 
478
638
 
479
639
  class ChangelogRequest(BaseModel):
480
- v1: str = DATA_CONTRACT_EXAMPLE_PAYLOAD
481
- v2: str = DATA_CONTRACT_EXAMPLE_PAYLOAD
640
+ """The two data contract versions to compare."""
641
+
642
+ v1: str = Field(
643
+ default=DATA_CONTRACT_EXAMPLE_PAYLOAD,
644
+ title="Source Data Contract YAML",
645
+ description="The data contract as it was before, as a YAML string.",
646
+ )
647
+ v2: str = Field(
648
+ default=DATA_CONTRACT_EXAMPLE_PAYLOAD,
649
+ title="Target Data Contract YAML",
650
+ description="The data contract as it is now, as a YAML string.",
651
+ )
652
+
653
+
654
+ class ChangelogResponse(BaseModel):
655
+ """The differences between two versions of a data contract."""
656
+
657
+ summary: list[ChangelogEntry] = Field(
658
+ description="One entry per changed element, rolled up to the level a reader cares about "
659
+ "(a renamed property is one entry, not one per changed attribute). Values are omitted.",
660
+ )
661
+ entries: list[ChangelogEntry] = Field(
662
+ description="Every individual change, with the old and new value.",
663
+ )
482
664
 
483
665
 
484
666
  @app.post(
485
667
  "/changelog",
486
668
  tags=["changelog"],
487
- summary="Show a changelog between two data contracts.",
669
+ operation_id="changelogBetweenDataContracts",
670
+ summary="Show a changelog between two data contracts",
488
671
  description="""
489
- Compare two ODCS data contract YAMLs and return a changelog.
490
- POST a JSON body with `v1` (source/before) and `v2` (target/after) as YAML strings.
672
+ Compare two versions of an ODCS data contract and return what changed between them. Useful to
673
+ decide whether a new version is a breaking change before publishing it.
674
+
675
+ `POST` a JSON body with `v1` (before) and `v2` (after) as YAML strings. A contract that cannot be
676
+ parsed is answered with `422`.
491
677
  """,
678
+ response_description="The changelog, as a rolled-up summary and the individual changes.",
679
+ responses={
680
+ **AUTHENTICATION_RESPONSES,
681
+ 422: {
682
+ "description": "One of the two data contracts is not valid YAML or not a valid data contract.",
683
+ "model": UnprocessableEntityResponse,
684
+ "content": {"application/json": {"example": {"detail": "Invalid YAML: while parsing a block mapping"}}},
685
+ },
686
+ },
492
687
  )
493
688
  async def changelog_endpoint(
494
689
  body: ChangelogRequest,
495
690
  api_key: Annotated[str | None, Depends(api_key_header)] = None,
496
- ):
691
+ ) -> ChangelogResponse:
497
692
  check_api_key(api_key)
498
693
 
499
694
  with tempfile.NamedTemporaryFile(mode="w", suffix=".yaml", delete=False) as f1:
@@ -505,7 +700,7 @@ async def changelog_endpoint(
505
700
 
506
701
  try:
507
702
  result = DataContract(data_contract_file=v1_path).changelog(DataContract(data_contract_file=v2_path))
508
- return {"summary": result.summary, "entries": result.entries}
703
+ return ChangelogResponse(summary=result.summary, entries=result.entries)
509
704
  except yaml.YAMLError as e:
510
705
  raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
511
706
  except pydantic.ValidationError as e:
@@ -520,8 +715,53 @@ async def changelog_endpoint(
520
715
  @app.post(
521
716
  "/export",
522
717
  tags=["export"],
523
- summary="Convert data contract to a specific format.",
718
+ operation_id="exportDataContract",
719
+ summary="Convert a data contract to another format",
720
+ description="""
721
+ Convert a data contract into another format, such as SQL DDL, Avro, Protobuf, dbt, or HTML.
722
+
723
+ The response is the converted document as `text/plain`; its actual syntax depends on the requested
724
+ `format`. Some formats have extra parameters, marked with the format they apply to in their
725
+ description.
726
+ """,
727
+ response_description="The data contract converted to the requested format.",
524
728
  response_class=PlainTextResponse,
729
+ # Spelled out rather than reusing the shared entries, because a route with a
730
+ # non-JSON response_class would have FastAPI document every declared model in
731
+ # that media type — while errors are always returned as JSON.
732
+ responses={
733
+ 200: {
734
+ "description": "The data contract converted to the requested format.",
735
+ "content": {
736
+ "text/plain": {
737
+ "schema": {"type": "string"},
738
+ "example": "CREATE TABLE orders (\n order_id UUID PRIMARY KEY,\n order_total INTEGER NOT NULL\n);",
739
+ }
740
+ },
741
+ },
742
+ 401: {
743
+ "description": AUTHENTICATION_RESPONSES[401]["description"],
744
+ "content": {
745
+ "application/json": {
746
+ "schema": {"$ref": "#/components/schemas/ErrorResponse"},
747
+ "example": {"detail": "Missing API key. Use Header 'x-api-key' to provide the API key."},
748
+ }
749
+ },
750
+ },
751
+ 403: {
752
+ "description": AUTHENTICATION_RESPONSES[403]["description"],
753
+ "content": {
754
+ "application/json": {
755
+ "schema": {"$ref": "#/components/schemas/ErrorResponse"},
756
+ "example": {"detail": "The provided API key is not correct."},
757
+ }
758
+ },
759
+ },
760
+ 422: {
761
+ "description": "The data contract could not be parsed, or is not a valid data contract.",
762
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UnprocessableEntityResponse"}}},
763
+ },
764
+ },
525
765
  )
526
766
  def export(
527
767
  body: Annotated[
@@ -532,7 +772,14 @@ def export(
532
772
  examples=[DATA_CONTRACT_EXAMPLE_PAYLOAD],
533
773
  ),
534
774
  ],
535
- format: Annotated[ExportFormat, typer.Option(help="The export format.")],
775
+ format: Annotated[
776
+ ExportFormat,
777
+ Query(
778
+ description="The format to convert the data contract to.",
779
+ examples=["sql"],
780
+ ),
781
+ ],
782
+ api_key: Annotated[str | None, Depends(api_key_header)] = None,
536
783
  server: Annotated[
537
784
  str | None,
538
785
  Query(
@@ -546,24 +793,35 @@ def export(
546
793
  description="Use the key of the model in the data contract yaml file "
547
794
  "to refer to a model, e.g., `orders`, or `all` for all "
548
795
  "models (default).",
796
+ examples=["all"],
549
797
  ),
550
798
  ] = "all",
551
799
  rdf_base: Annotated[
552
800
  Optional[str],
553
- typer.Option(help="[rdf] The base URI used to generate the RDF graph.", rich_help_panel="RDF Options"),
801
+ Query(
802
+ description="[rdf] The base URI used to generate the RDF graph.",
803
+ examples=["https://example.com/"],
804
+ ),
554
805
  ] = None,
555
806
  sql_server_type: Annotated[
556
807
  Optional[str],
557
808
  Query(
558
809
  description="[sql] The server type to determine the sql dialect. By default, it uses 'auto' to automatically detect the sql dialect via the specified servers in the data contract.",
810
+ examples=["postgres"],
559
811
  ),
560
812
  ] = None,
561
813
  ):
562
- result = DataContract(data_contract_str=body, server=server).export(
563
- export_format=format,
564
- model=model,
565
- rdf_base=rdf_base,
566
- sql_server_type=sql_server_type,
567
- )
568
-
569
- return result
814
+ check_api_key(api_key)
815
+ try:
816
+ return DataContract(data_contract_str=body, server=server).export(
817
+ export_format=format,
818
+ model=model,
819
+ rdf_base=rdf_base,
820
+ sql_server_type=sql_server_type,
821
+ )
822
+ except yaml.YAMLError as e:
823
+ raise HTTPException(status_code=422, detail=f"Invalid YAML: {e}")
824
+ except pydantic.ValidationError as e:
825
+ raise HTTPException(status_code=422, detail=f"Invalid data contract: {e}")
826
+ except DataContractException as e:
827
+ raise HTTPException(status_code=422, detail=f"Data Contract Validation Failure: {e}")
@@ -46,7 +46,7 @@ def api(
46
46
  This is highly recommended, as data contract tests may be subject to SQL injections or leak sensitive information.
47
47
 
48
48
  To connect to servers (such as a Snowflake data source), set the credentials as environment variables as documented in
49
- https://cli.datacontract.com/#test
49
+ https://docs.datacontract.com/configuration
50
50
 
51
51
  It is possible to run the API with extra arguments for `uvicorn.run()` as keyword arguments, e.g.:
52
52
  `datacontract api --port 1234 --root_path /datacontract`.
@@ -61,6 +61,13 @@ def ci(
61
61
  OutputFormat,
62
62
  typer.Option(help="The target format for the test results. Accepted values: json, junit."),
63
63
  ] = None,
64
+ metadata_only: Annotated[
65
+ bool,
66
+ typer.Option(
67
+ help="Run only checks that read the schema (field presence and types). "
68
+ "Checks that read row values are skipped."
69
+ ),
70
+ ] = False,
64
71
  logs: Annotated[bool, typer.Option(help="Print logs")] = False,
65
72
  json_output: Annotated[bool, typer.Option("--json", help="Print test results as JSON to stdout.")] = False,
66
73
  fail_on: Annotated[
@@ -119,6 +126,7 @@ def ci(
119
126
  server=server,
120
127
  ssl_verification=ssl_verification,
121
128
  inline_references=inline_references,
129
+ metadata_only=metadata_only,
122
130
  ).test()
123
131
  if logs:
124
132
  _print_logs(run, out)
@@ -667,7 +667,7 @@ def export_excel(
667
667
  location: location_arg = "datacontract.yaml",
668
668
  template: Annotated[
669
669
  Optional[str],
670
- typer.Option(help="Path or URL to a custom Excel template."),
670
+ typer.Option(help="Path or URL to a custom Excel template. Defaults to the bundled ODCS template."),
671
671
  ] = None,
672
672
  output: output_option = None,
673
673
  server: server_option = None,
@@ -416,6 +416,26 @@ def import_protobuf(
416
416
  _write_result(result, output)
417
417
 
418
418
 
419
+ @import_app.command(
420
+ name="pydantic-model",
421
+ epilog="Example: datacontract import pydantic-model --source models.py --output datacontract.yaml",
422
+ )
423
+ def import_pydantic_model(
424
+ source: Annotated[Optional[str], typer.Option(help="Path to the Python file defining the Pydantic models.")] = None,
425
+ output: output_option = None,
426
+ schema: schema_option = None,
427
+ owner: owner_option = None,
428
+ id: id_option = None,
429
+ debug: debug_option = None,
430
+ ):
431
+ """Import a data contract from Pydantic models."""
432
+ enable_debug_logging(debug)
433
+ result = DataContract.import_from_source(
434
+ config=cli_config(), format="pydantic-model", source=source, schema=schema, owner=owner, id=id
435
+ )
436
+ _write_result(result, output)
437
+
438
+
419
439
  @import_app.command(
420
440
  name="spark",
421
441
  epilog="Example: datacontract import spark --tables orders,customers --output datacontract.yaml",