datacontract-cli 0.11.6__tar.gz → 0.11.7__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 (220) hide show
  1. {datacontract_cli-0.11.6/datacontract_cli.egg-info → datacontract_cli-0.11.7}/PKG-INFO +41 -6
  2. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/README.md +32 -0
  3. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/catalog/catalog.py +2 -0
  4. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/data_contract_checks.py +18 -6
  5. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/check_soda_execute.py +5 -0
  6. datacontract_cli-0.11.7/datacontract/engines/soda/connections/mysql.py +19 -0
  7. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/exporter.py +2 -0
  8. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sql_exporter.py +6 -2
  9. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sql_type_converter.py +51 -0
  10. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dbml_importer.py +2 -1
  11. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/odcs_helper.py +3 -0
  12. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/parquet_importer.py +20 -0
  13. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/sql_importer.py +101 -69
  14. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/unity_importer.py +2 -1
  15. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/index.html +3 -3
  16. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7/datacontract_cli.egg-info}/PKG-INFO +41 -6
  17. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/SOURCES.txt +3 -0
  18. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/requires.txt +9 -5
  19. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/pyproject.toml +19 -6
  20. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_catalog.py +15 -0
  21. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_data_contract_checks.py +131 -0
  22. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sql.py +14 -0
  23. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sql_query.py +16 -0
  24. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_parquet.py +41 -0
  25. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_oracle.py +14 -8
  26. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_postgres.py +4 -10
  27. datacontract_cli-0.11.7/tests/test_import_sql_snowflake.py +171 -0
  28. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_sqlserver.py +12 -6
  29. datacontract_cli-0.11.7/tests/test_test_mysql.py +78 -0
  30. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/LICENSE +0 -0
  31. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/MANIFEST.in +0 -0
  32. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/__init__.py +0 -0
  33. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/api.py +0 -0
  34. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/cli.py +0 -0
  35. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/data_contract.py +0 -0
  36. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/__init__.py +0 -0
  37. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/data_contract_test.py +0 -0
  38. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
  39. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
  40. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
  41. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
  42. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/__init__.py +0 -0
  43. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/athena.py +0 -0
  44. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/bigquery.py +0 -0
  45. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/databricks.py +0 -0
  46. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/duckdb_connection.py +0 -0
  47. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/impala.py +0 -0
  48. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/kafka.py +0 -0
  49. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/oracle.py +0 -0
  50. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/postgres.py +0 -0
  51. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/snowflake.py +0 -0
  52. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/sqlserver.py +0 -0
  53. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/trino.py +0 -0
  54. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/__init__.py +0 -0
  55. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/avro_exporter.py +0 -0
  56. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/avro_idl_exporter.py +0 -0
  57. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/bigquery_exporter.py +0 -0
  58. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/custom_exporter.py +0 -0
  59. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/data_caterer_exporter.py +0 -0
  60. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dbml_exporter.py +0 -0
  61. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dbt_exporter.py +0 -0
  62. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dcs_exporter.py +0 -0
  63. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dqx_exporter.py +0 -0
  64. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/duckdb_type_converter.py +0 -0
  65. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/excel_exporter.py +0 -0
  66. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/exporter_factory.py +0 -0
  67. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/go_exporter.py +0 -0
  68. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/great_expectations_exporter.py +0 -0
  69. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/html_exporter.py +0 -0
  70. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/iceberg_exporter.py +0 -0
  71. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/jsonschema_exporter.py +0 -0
  72. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/markdown_exporter.py +0 -0
  73. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/mermaid_exporter.py +0 -0
  74. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/odcs_export_helper.py +0 -0
  75. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/odcs_v3_exporter.py +0 -0
  76. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/pandas_type_converter.py +0 -0
  77. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/protobuf_exporter.py +0 -0
  78. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/pydantic_exporter.py +0 -0
  79. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/rdf_exporter.py +0 -0
  80. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sodacl_exporter.py +0 -0
  81. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/spark_exporter.py +0 -0
  82. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sqlalchemy_exporter.py +0 -0
  83. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/avro_importer.py +0 -0
  84. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/bigquery_importer.py +0 -0
  85. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/csv_importer.py +0 -0
  86. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dbt_importer.py +0 -0
  87. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dcs_importer.py +0 -0
  88. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/excel_importer.py +0 -0
  89. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/glue_importer.py +0 -0
  90. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/iceberg_importer.py +0 -0
  91. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/importer.py +0 -0
  92. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/importer_factory.py +0 -0
  93. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/json_importer.py +0 -0
  94. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/jsonschema_importer.py +0 -0
  95. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/odcs_importer.py +0 -0
  96. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/protobuf_importer.py +0 -0
  97. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/spark_importer.py +0 -0
  98. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/init/init_template.py +0 -0
  99. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/integration/entropy_data.py +0 -0
  100. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/files.py +0 -0
  101. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/resolve.py +0 -0
  102. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/resources.py +0 -0
  103. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/schema.py +0 -0
  104. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/urls.py +0 -0
  105. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/exceptions.py +0 -0
  106. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/odcs.py +0 -0
  107. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/run.py +0 -0
  108. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/__init__.py +0 -0
  109. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/json_test_results.py +0 -0
  110. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/junit_test_results.py +0 -0
  111. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/output_format.py +0 -0
  112. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/test_results_writer.py +0 -0
  113. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/py.typed +0 -0
  114. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
  115. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
  116. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
  117. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
  118. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
  119. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
  120. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
  121. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
  122. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
  123. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
  124. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/datacontract.html +0 -0
  125. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/datacontract_odcs.html +0 -0
  126. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_information.html +0 -0
  127. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
  128. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_terms.html +0 -0
  129. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/definition.html +0 -0
  130. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/example.html +0 -0
  131. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/model_field.html +0 -0
  132. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/quality.html +0 -0
  133. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/server.html +0 -0
  134. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/style/output.css +0 -0
  135. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/dependency_links.txt +0 -0
  136. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/entry_points.txt +0 -0
  137. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/top_level.txt +0 -0
  138. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/setup.cfg +0 -0
  139. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_api.py +0 -0
  140. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_bigquery_soda_connection.py +0 -0
  141. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_cli.py +0 -0
  142. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_data_contract_specification.py +0 -0
  143. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_description_linter.py +0 -0
  144. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_download_datacontract_file.py +0 -0
  145. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_duckdb_json.py +0 -0
  146. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_avro.py +0 -0
  147. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_avro_idl.py +0 -0
  148. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_bigquery.py +0 -0
  149. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_complex_data_contract.py +0 -0
  150. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_custom.py +0 -0
  151. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_custom_exporter.py +0 -0
  152. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_data_caterer.py +0 -0
  153. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbml.py +0 -0
  154. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_models.py +0 -0
  155. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_sources.py +0 -0
  156. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_staging_sql.py +0 -0
  157. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dqx.py +0 -0
  158. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_excel.py +0 -0
  159. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_go.py +0 -0
  160. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_great_expectations.py +0 -0
  161. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_html.py +0 -0
  162. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_iceberg.py +0 -0
  163. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_jsonschema.py +0 -0
  164. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_markdown.py +0 -0
  165. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_mermaid.py +0 -0
  166. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_odcs_v3.py +0 -0
  167. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_protobuf.py +0 -0
  168. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_pydantic.py +0 -0
  169. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_rdf.py +0 -0
  170. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sodacl.py +0 -0
  171. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_spark.py +0 -0
  172. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sqlalchemy.py +0 -0
  173. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_avro.py +0 -0
  174. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_bigquery.py +0 -0
  175. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_csv.py +0 -0
  176. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_dbml.py +0 -0
  177. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_dbt.py +0 -0
  178. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_excel.py +0 -0
  179. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_glue.py +0 -0
  180. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_iceberg.py +0 -0
  181. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_json.py +0 -0
  182. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_jsonschema.py +0 -0
  183. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_odcs_v3.py +0 -0
  184. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_protobuf.py +0 -0
  185. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_spark.py +0 -0
  186. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_unity_file.py +0 -0
  187. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_integration_entropydata.py +0 -0
  188. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_lint.py +0 -0
  189. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_resolve.py +0 -0
  190. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_roundtrip_jsonschema.py +0 -0
  191. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_sqlserver_soda_connection.py +0 -0
  192. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_api.py +0 -0
  193. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_athena_iceberg.py +0 -0
  194. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_azure_remote.py +0 -0
  195. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_bigquery.py +0 -0
  196. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_databricks.py +0 -0
  197. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_dataframe.py +0 -0
  198. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_delta.py +0 -0
  199. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_gcs_csv_remote.py +0 -0
  200. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_gcs_json_remote.py +0 -0
  201. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_kafka.py +0 -0
  202. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_kafka_remote.py +0 -0
  203. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_local_json.py +0 -0
  204. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_local_json_nd.py +0 -0
  205. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_oracle.py +0 -0
  206. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_output_json.py +0 -0
  207. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_output_junit.py +0 -0
  208. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_parquet.py +0 -0
  209. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_postgres.py +0 -0
  210. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_quality.py +0 -0
  211. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_csv.py +0 -0
  212. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_delta.py +0 -0
  213. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json.py +0 -0
  214. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_complex.py +0 -0
  215. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_multiple_models.py +0 -0
  216. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_remote.py +0 -0
  217. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_schema_evolution.py +0 -0
  218. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_snowflake.py +0 -0
  219. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_sqlserver.py +0 -0
  220. {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_trino.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 0.11.6
3
+ Version: 0.11.7
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
@@ -43,19 +43,22 @@ Requires-Dist: databricks-sdk<0.86.0; extra == "databricks"
43
43
  Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "databricks"
44
44
  Requires-Dist: numpy<2.0.0,>=1.26.4; extra == "databricks"
45
45
  Provides-Extra: iceberg
46
- Requires-Dist: pyiceberg==0.10.0; extra == "iceberg"
46
+ Requires-Dist: pyiceberg==0.11.0; extra == "iceberg"
47
47
  Provides-Extra: kafka
48
48
  Requires-Dist: datacontract-cli[avro]; extra == "kafka"
49
49
  Requires-Dist: soda-core-spark-df<3.6.0,>=3.3.20; extra == "kafka"
50
50
  Requires-Dist: pyspark<5.0.0,>=3.5.0; extra == "kafka"
51
51
  Requires-Dist: numpy<2.0.0,>=1.26.4; extra == "kafka"
52
+ Provides-Extra: mysql
53
+ Requires-Dist: soda-core-mysql<3.6.0,>=3.3.20; extra == "mysql"
54
+ Requires-Dist: mysql-connector-python<10.0.0,>=8.0.30; extra == "mysql"
52
55
  Provides-Extra: postgres
53
56
  Requires-Dist: soda-core-postgres<3.6.0,>=3.3.20; extra == "postgres"
54
57
  Provides-Extra: s3
55
58
  Requires-Dist: s3fs<2027.0.0,>=2025.2.0; extra == "s3"
56
59
  Requires-Dist: aiobotocore<3.2.0,>=2.17.0; extra == "s3"
57
60
  Provides-Extra: snowflake
58
- Requires-Dist: snowflake-connector-python[pandas]<4.3,>=3.6; extra == "snowflake"
61
+ Requires-Dist: snowflake-connector-python[pandas]<4.4,>=3.6; extra == "snowflake"
59
62
  Requires-Dist: soda-core-snowflake<3.6.0,>=3.3.20; extra == "snowflake"
60
63
  Provides-Extra: sqlserver
61
64
  Requires-Dist: soda-core-sqlserver<3.6.0,>=3.3.20; extra == "sqlserver"
@@ -82,7 +85,7 @@ Requires-Dist: uvicorn==0.40.0; extra == "api"
82
85
  Provides-Extra: protobuf
83
86
  Requires-Dist: grpcio-tools>=1.53; extra == "protobuf"
84
87
  Provides-Extra: all
85
- Requires-Dist: datacontract-cli[api,athena,bigquery,csv,databricks,dbml,dbt,duckdb,excel,iceberg,kafka,oracle,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
88
+ Requires-Dist: datacontract-cli[api,athena,bigquery,csv,databricks,dbml,dbt,duckdb,excel,iceberg,kafka,mysql,oracle,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
86
89
  Provides-Extra: dev
87
90
  Requires-Dist: datacontract-cli[all]; extra == "dev"
88
91
  Requires-Dist: httpx==0.28.1; extra == "dev"
@@ -94,8 +97,8 @@ Requires-Dist: pre-commit<4.6.0,>=3.7.1; extra == "dev"
94
97
  Requires-Dist: pytest; extra == "dev"
95
98
  Requires-Dist: pytest-xdist; extra == "dev"
96
99
  Requires-Dist: pymssql==2.3.13; extra == "dev"
97
- Requires-Dist: ruff==0.14.3; extra == "dev"
98
- Requires-Dist: testcontainers[kafka,minio,mssql,postgres]==4.14.1; extra == "dev"
100
+ Requires-Dist: ruff==0.15.2; extra == "dev"
101
+ Requires-Dist: testcontainers[kafka,minio,mssql,mysql,postgres]==4.14.1; extra == "dev"
99
102
  Requires-Dist: trino==0.336.0; extra == "dev"
100
103
  Dynamic: license-file
101
104
 
@@ -340,6 +343,7 @@ A list of available extras:
340
343
  | DuckDB (local/S3/GCS/Azure file testing) | `pip install datacontract-cli[duckdb]` |
341
344
  | Iceberg | `pip install datacontract-cli[iceberg]` |
342
345
  | Kafka Integration | `pip install datacontract-cli[kafka]` |
346
+ | MySQL Integration | `pip install datacontract-cli[mysql]` |
343
347
  | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
344
348
  | S3 Integration | `pip install datacontract-cli[s3]` |
345
349
  | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
@@ -496,6 +500,7 @@ Supported server types:
496
500
  - [snowflake](#snowflake)
497
501
  - [kafka](#kafka)
498
502
  - [postgres](#postgres)
503
+ - [mysql](#mysql)
499
504
  - [trino](#trino)
500
505
  - [impala](#impala)
501
506
  - [api](#api)
@@ -997,6 +1002,36 @@ models:
997
1002
  | `DATACONTRACT_POSTGRES_PASSWORD` | `mysecretpassword` | Password |
998
1003
 
999
1004
 
1005
+ #### MySQL
1006
+
1007
+ Data Contract CLI can test data in MySQL or MySQL-compliant databases (e.g., MariaDB).
1008
+
1009
+ ##### Example
1010
+
1011
+ datacontract.yaml
1012
+ ```yaml
1013
+ servers:
1014
+ mysql:
1015
+ type: mysql
1016
+ host: localhost
1017
+ port: 3306
1018
+ database: mydb
1019
+ models:
1020
+ my_table_1: # corresponds to a table
1021
+ type: table
1022
+ fields:
1023
+ my_column_1: # corresponds to a column
1024
+ type: varchar
1025
+ ```
1026
+
1027
+ ##### Environment Variables
1028
+
1029
+ | Environment Variable | Example | Description |
1030
+ |-------------------------------|--------------------|-------------|
1031
+ | `DATACONTRACT_MYSQL_USERNAME` | `root` | Username |
1032
+ | `DATACONTRACT_MYSQL_PASSWORD` | `mysecretpassword` | Password |
1033
+
1034
+
1000
1035
  #### Trino
1001
1036
 
1002
1037
  Data Contract CLI can test data in Trino.
@@ -239,6 +239,7 @@ A list of available extras:
239
239
  | DuckDB (local/S3/GCS/Azure file testing) | `pip install datacontract-cli[duckdb]` |
240
240
  | Iceberg | `pip install datacontract-cli[iceberg]` |
241
241
  | Kafka Integration | `pip install datacontract-cli[kafka]` |
242
+ | MySQL Integration | `pip install datacontract-cli[mysql]` |
242
243
  | PostgreSQL Integration | `pip install datacontract-cli[postgres]` |
243
244
  | S3 Integration | `pip install datacontract-cli[s3]` |
244
245
  | Snowflake Integration | `pip install datacontract-cli[snowflake]` |
@@ -395,6 +396,7 @@ Supported server types:
395
396
  - [snowflake](#snowflake)
396
397
  - [kafka](#kafka)
397
398
  - [postgres](#postgres)
399
+ - [mysql](#mysql)
398
400
  - [trino](#trino)
399
401
  - [impala](#impala)
400
402
  - [api](#api)
@@ -896,6 +898,36 @@ models:
896
898
  | `DATACONTRACT_POSTGRES_PASSWORD` | `mysecretpassword` | Password |
897
899
 
898
900
 
901
+ #### MySQL
902
+
903
+ Data Contract CLI can test data in MySQL or MySQL-compliant databases (e.g., MariaDB).
904
+
905
+ ##### Example
906
+
907
+ datacontract.yaml
908
+ ```yaml
909
+ servers:
910
+ mysql:
911
+ type: mysql
912
+ host: localhost
913
+ port: 3306
914
+ database: mydb
915
+ models:
916
+ my_table_1: # corresponds to a table
917
+ type: table
918
+ fields:
919
+ my_column_1: # corresponds to a column
920
+ type: varchar
921
+ ```
922
+
923
+ ##### Environment Variables
924
+
925
+ | Environment Variable | Example | Description |
926
+ |-------------------------------|--------------------|-------------|
927
+ | `DATACONTRACT_MYSQL_USERNAME` | `root` | Username |
928
+ | `DATACONTRACT_MYSQL_PASSWORD` | `mysecretpassword` | Password |
929
+
930
+
899
931
  #### Trino
900
932
 
901
933
  Data Contract CLI can test data in Trino.
@@ -65,6 +65,7 @@ class _SpecView:
65
65
 
66
66
  info: _InfoView
67
67
  models: dict
68
+ tags: list[str] | None = None
68
69
 
69
70
 
70
71
  @dataclass
@@ -109,6 +110,7 @@ class DataContractView:
109
110
  description=description,
110
111
  ),
111
112
  models=models,
113
+ tags=self.odcs.tags,
112
114
  )
113
115
 
114
116
 
@@ -25,6 +25,18 @@ class QuotingConfig:
25
25
  quote_model_name_with_backticks: bool = False
26
26
 
27
27
 
28
+ def _escape_sql_string_values(values):
29
+ """Escape single quotes in string values for use in SodaCL checks.
30
+
31
+ SodaCL renders valid/invalid values directly into SQL IN clauses, so single
32
+ quotes inside string values (e.g. "peter's") must be escaped as two single
33
+ quotes (e.g. "peter''s") to produce valid SQL.
34
+ """
35
+ if values is None:
36
+ return None
37
+ return [v.replace("'", "''") if isinstance(v, str) else v for v in values]
38
+
39
+
28
40
  def _quote_field_name(field_name: str, quoting_config: QuotingConfig) -> str:
29
41
  """Quote a field name according to the quoting configuration."""
30
42
  if field_name is None:
@@ -85,9 +97,9 @@ def to_schema_checks(schema_object: SchemaObject, server: Server) -> List[Check]
85
97
  type1 = server.type if server and server.type else None
86
98
  config = QuotingConfig(
87
99
  quote_field_name=type1 in ["postgres", "sqlserver", "snowflake", "azure", "s3", "gcs", "local"],
88
- quote_field_name_with_backticks=type1 in ["databricks"],
100
+ quote_field_name_with_backticks=type1 in ["databricks", "bigquery", "mysql"],
89
101
  quote_model_name=type1 in ["postgres", "sqlserver", "snowflake", "azure", "s3", "gcs", "local"],
90
- quote_model_name_with_backticks=type1 == "bigquery",
102
+ quote_model_name_with_backticks=type1 in ["databricks", "bigquery", "mysql"],
91
103
  )
92
104
  quoting_config = config
93
105
 
@@ -432,7 +444,7 @@ def check_property_not_equal(
432
444
  {
433
445
  f"invalid_count({field_name_for_soda}) = 0": {
434
446
  "name": check_key,
435
- "invalid values": [value],
447
+ "invalid values": _escape_sql_string_values([value]),
436
448
  },
437
449
  }
438
450
  ],
@@ -461,7 +473,7 @@ def check_property_enum(model_name: str, field_name: str, enum: list, quoting_co
461
473
  {
462
474
  f"invalid_count({field_name_for_soda}) = 0": {
463
475
  "name": check_key,
464
- "valid values": enum,
476
+ "valid values": _escape_sql_string_values(enum),
465
477
  },
466
478
  }
467
479
  ],
@@ -639,7 +651,7 @@ def check_property_invalid_values(
639
651
  }
640
652
 
641
653
  if valid_values is not None:
642
- sodacl_check_config["valid values"] = valid_values
654
+ sodacl_check_config["valid values"] = _escape_sql_string_values(valid_values)
643
655
 
644
656
  sodacl_check_dict = {
645
657
  checks_for(model_name, quoting_config, check_type): [
@@ -681,7 +693,7 @@ def check_property_missing_values(
681
693
  if missing_values is not None:
682
694
  filtered_missing_values = [v for v in missing_values if v is not None]
683
695
  if filtered_missing_values:
684
- sodacl_check_config["missing values"] = filtered_missing_values
696
+ sodacl_check_config["missing values"] = _escape_sql_string_values(filtered_missing_values)
685
697
 
686
698
  sodacl_check_dict = {
687
699
  checks_for(model_name, quoting_config, check_type): [
@@ -16,6 +16,7 @@ from datacontract.engines.soda.connections.databricks import to_databricks_soda_
16
16
  from datacontract.engines.soda.connections.duckdb_connection import get_duckdb_connection
17
17
  from datacontract.engines.soda.connections.impala import to_impala_soda_configuration
18
18
  from datacontract.engines.soda.connections.kafka import create_spark_session, read_kafka_topic
19
+ from datacontract.engines.soda.connections.mysql import to_mysql_soda_configuration
19
20
  from datacontract.engines.soda.connections.postgres import to_postgres_soda_configuration
20
21
  from datacontract.engines.soda.connections.snowflake import to_snowflake_soda_configuration
21
22
  from datacontract.engines.soda.connections.sqlserver import to_sqlserver_soda_configuration
@@ -73,6 +74,10 @@ def check_soda_execute(
73
74
  soda_configuration_str = to_postgres_soda_configuration(server)
74
75
  scan.add_configuration_yaml_str(soda_configuration_str)
75
76
  scan.set_data_source_name(server.type)
77
+ elif server.type == "mysql":
78
+ soda_configuration_str = to_mysql_soda_configuration(server)
79
+ scan.add_configuration_yaml_str(soda_configuration_str)
80
+ scan.set_data_source_name(server.type)
76
81
  elif server.type == "databricks":
77
82
  if spark is not None:
78
83
  run.log_info("Connecting to databricks via spark")
@@ -0,0 +1,19 @@
1
+ import os
2
+
3
+ import yaml
4
+
5
+
6
+ def to_mysql_soda_configuration(server):
7
+ soda_configuration = {
8
+ f"data_source {server.type}": {
9
+ "type": "mysql",
10
+ "host": server.host,
11
+ "port": str(server.port),
12
+ "username": os.getenv("DATACONTRACT_MYSQL_USERNAME"),
13
+ "password": os.getenv("DATACONTRACT_MYSQL_PASSWORD"),
14
+ "database": server.database,
15
+ }
16
+ }
17
+
18
+ soda_configuration_str = yaml.dump(soda_configuration)
19
+ return soda_configuration_str
@@ -115,6 +115,8 @@ def _determine_sql_server_type(
115
115
  return "snowflake"
116
116
  elif "postgres" in server_types:
117
117
  return "postgres"
118
+ elif "mysql" in server_types:
119
+ return "mysql"
118
120
  elif "databricks" in server_types:
119
121
  return "databricks"
120
122
  else:
@@ -46,7 +46,7 @@ def _to_sql_query(model_name: str, model_value: SchemaObject, server_type: str)
46
46
  if model_value.properties:
47
47
  for prop in model_value.properties:
48
48
  # TODO escape SQL reserved key words, probably dependent on server type
49
- columns.append(prop.name)
49
+ columns.append(prop.physicalName or prop.name)
50
50
 
51
51
  result = "select\n"
52
52
  current_column_index = 1
@@ -82,6 +82,9 @@ def to_sql_ddl(data_contract: OpenDataContractStandard, server_type: str = "snow
82
82
  if srv.type == "postgres":
83
83
  server_type = "postgres"
84
84
  break
85
+ if srv.type == "mysql":
86
+ server_type = "mysql"
87
+ break
85
88
  if srv.type == "databricks":
86
89
  server_type = "databricks"
87
90
  if srv.catalog is not None and srv.schema_ is not None:
@@ -114,7 +117,8 @@ def _to_sql_table(model_name: str, model: SchemaObject, server_type: str = "snow
114
117
 
115
118
  for prop in properties:
116
119
  type_str = convert_to_sql_type(prop, server_type)
117
- result += f" {prop.name} {type_str}"
120
+ column_name = prop.physicalName or prop.name
121
+ result += f" {column_name} {type_str}"
118
122
  if prop.required:
119
123
  result += " not null"
120
124
  if prop.primaryKey:
@@ -102,6 +102,8 @@ def convert_to_sql_type(field: Union[SchemaProperty, FieldLike], server_type: st
102
102
  return convert_to_snowflake(field)
103
103
  elif server_type == "postgres":
104
104
  return convert_type_to_postgres(field)
105
+ elif server_type == "mysql":
106
+ return convert_type_to_mysql(field)
105
107
  elif server_type == "dataframe":
106
108
  return convert_to_dataframe(field)
107
109
  elif server_type == "databricks":
@@ -214,6 +216,55 @@ def convert_type_to_postgres(field: Union[SchemaProperty, FieldLike]) -> None |
214
216
  return None
215
217
 
216
218
 
219
+ # https://dev.mysql.com/doc/refman/8.0/en/data-types.html
220
+ def convert_type_to_mysql(field: Union[SchemaProperty, FieldLike]) -> None | str:
221
+ mysql_type = _get_config_value(field, "mysqlType")
222
+ if mysql_type:
223
+ return mysql_type
224
+
225
+ type = _get_type(field)
226
+ if type is None:
227
+ return None
228
+ format = _get_format(field)
229
+ if type.lower() in ["string", "varchar", "text"]:
230
+ if format == "uuid":
231
+ return "varchar(36)"
232
+ if type.lower() == "varchar":
233
+ return "varchar"
234
+ if type.lower() == "text":
235
+ return "text"
236
+ return "varchar"
237
+ if type.lower() in ["timestamp", "timestamp_tz"]:
238
+ return "timestamp"
239
+ if type.lower() in ["timestamp_ntz"]:
240
+ return "datetime"
241
+ if type.lower() in ["date"]:
242
+ return "date"
243
+ if type.lower() in ["time"]:
244
+ return "time"
245
+ if type.lower() in ["number", "decimal", "numeric"]:
246
+ if type.lower() == "number":
247
+ return "decimal"
248
+ return type.lower()
249
+ if type.lower() in ["float"]:
250
+ return "float"
251
+ if type.lower() in ["double"]:
252
+ return "double"
253
+ if type.lower() in ["integer", "int"]:
254
+ return "int"
255
+ if type.lower() in ["long", "bigint"]:
256
+ return "bigint"
257
+ if type.lower() in ["boolean"]:
258
+ return "boolean"
259
+ if type.lower() in ["object", "record", "struct"]:
260
+ return "json"
261
+ if type.lower() in ["bytes"]:
262
+ return "blob"
263
+ if type.lower() in ["array"]:
264
+ return "json"
265
+ return None
266
+
267
+
217
268
  # dataframe data types:
218
269
  # https://spark.apache.org/docs/latest/sql-ref-datatypes.html
219
270
  def convert_to_dataframe(field: Union[SchemaProperty, FieldLike]) -> None | str:
@@ -97,7 +97,7 @@ def import_table_fields(table, references) -> List[SchemaProperty]:
97
97
  description = field.note.text if field.note else None
98
98
  is_primary_key = field.pk
99
99
  is_unique = field.unique
100
- logical_type = map_type_from_sql(field.type)
100
+ logical_type, format = map_type_from_sql(field.type)
101
101
 
102
102
  ref = get_reference(field, references)
103
103
 
@@ -109,6 +109,7 @@ def import_table_fields(table, references) -> List[SchemaProperty]:
109
109
  name=field_name,
110
110
  logical_type=logical_type if logical_type else "string",
111
111
  physical_type=field.type,
112
+ format=format,
112
113
  description=description,
113
114
  required=required if required else None,
114
115
  primary_key=is_primary_key if is_primary_key else None,
@@ -34,6 +34,7 @@ def create_schema_object(
34
34
  description: str = None,
35
35
  business_name: str = None,
36
36
  properties: List[SchemaProperty] = None,
37
+ tags: List[str] = None,
37
38
  ) -> SchemaObject:
38
39
  """Create a SchemaObject (equivalent to DCS Model)."""
39
40
  schema = SchemaObject(
@@ -48,6 +49,8 @@ def create_schema_object(
48
49
  schema.businessName = business_name
49
50
  if properties:
50
51
  schema.properties = properties
52
+ if tags:
53
+ schema.tags = tags
51
54
  return schema
52
55
 
53
56
 
@@ -85,6 +85,26 @@ def map_pyarrow_field_to_property(pyarrow_field: pyarrow.Field, field_name: str)
85
85
  return create_property(name=field_name, logical_type="object", physical_type="STRUCT")
86
86
  if pyarrow.types.is_list(pyarrow_field.type):
87
87
  return create_property(name=field_name, logical_type="array", physical_type="LIST")
88
+ if pyarrow.types.is_large_string(pyarrow_field.type):
89
+ return create_property(name=field_name, logical_type="string", physical_type="LARGE_STRING")
90
+ if pyarrow.types.is_large_binary(pyarrow_field.type):
91
+ return create_property(name=field_name, logical_type="bytes", physical_type="LARGE_BINARY")
92
+ if pyarrow.types.is_large_list(pyarrow_field.type):
93
+ return create_property(name=field_name, logical_type="array", physical_type="LARGE_LIST")
94
+ if pyarrow.types.is_float16(pyarrow_field.type):
95
+ return create_property(name=field_name, logical_type="number", physical_type="HALF_FLOAT")
96
+ if pyarrow.types.is_time(pyarrow_field.type):
97
+ return create_property(name=field_name, logical_type="time", physical_type="TIME")
98
+ if pyarrow.types.is_duration(pyarrow_field.type):
99
+ return create_property(name=field_name, logical_type="string", physical_type="DURATION")
100
+ if pyarrow.types.is_fixed_size_binary(pyarrow_field.type):
101
+ return create_property(
102
+ name=field_name,
103
+ logical_type="bytes",
104
+ physical_type=f"FIXED_SIZE_BINARY({pyarrow_field.type.byte_width})",
105
+ )
106
+ if pyarrow.types.is_fixed_size_list(pyarrow_field.type):
107
+ return create_property(name=field_name, logical_type="array", physical_type="FIXED_SIZE_LIST")
88
108
 
89
109
  raise DataContractException(
90
110
  type="schema",