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.
- {datacontract_cli-0.11.6/datacontract_cli.egg-info → datacontract_cli-0.11.7}/PKG-INFO +41 -6
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/README.md +32 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/catalog/catalog.py +2 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/data_contract_checks.py +18 -6
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/check_soda_execute.py +5 -0
- datacontract_cli-0.11.7/datacontract/engines/soda/connections/mysql.py +19 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/exporter.py +2 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sql_exporter.py +6 -2
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sql_type_converter.py +51 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dbml_importer.py +2 -1
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/odcs_helper.py +3 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/parquet_importer.py +20 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/sql_importer.py +101 -69
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/unity_importer.py +2 -1
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/index.html +3 -3
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7/datacontract_cli.egg-info}/PKG-INFO +41 -6
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/SOURCES.txt +3 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/requires.txt +9 -5
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/pyproject.toml +19 -6
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_catalog.py +15 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_data_contract_checks.py +131 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sql.py +14 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sql_query.py +16 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_parquet.py +41 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_oracle.py +14 -8
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_postgres.py +4 -10
- datacontract_cli-0.11.7/tests/test_import_sql_snowflake.py +171 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_sql_sqlserver.py +12 -6
- datacontract_cli-0.11.7/tests/test_test_mysql.py +78 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/LICENSE +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/MANIFEST.in +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/__init__.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/api.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/cli.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/data_contract.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/__init__.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/data_contract_test.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/datacontract/check_that_datacontract_file_exists.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/fastjsonschema/check_jsonschema.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/fastjsonschema/s3/s3_read_files.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/__init__.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/athena.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/bigquery.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/databricks.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/duckdb_connection.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/impala.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/kafka.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/oracle.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/postgres.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/snowflake.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/sqlserver.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/connections/trino.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/__init__.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/avro_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/avro_idl_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/bigquery_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/custom_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/data_caterer_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dbml_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dbt_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dcs_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/dqx_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/duckdb_type_converter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/excel_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/exporter_factory.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/go_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/great_expectations_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/html_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/iceberg_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/jsonschema_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/markdown_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/mermaid_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/odcs_export_helper.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/odcs_v3_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/pandas_type_converter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/protobuf_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/pydantic_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/rdf_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sodacl_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/spark_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sqlalchemy_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/avro_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/bigquery_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/csv_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dbt_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/dcs_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/excel_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/glue_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/iceberg_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/importer_factory.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/json_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/jsonschema_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/odcs_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/protobuf_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/spark_importer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/init/init_template.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/integration/entropy_data.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/files.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/resolve.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/resources.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/schema.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/lint/urls.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/exceptions.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/odcs.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/model/run.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/__init__.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/json_test_results.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/junit_test_results.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/output_format.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/output/test_results_writer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/py.typed +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.1.0.init.yaml +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.1.0.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.0.init.yaml +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.0.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.1.init.yaml +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/datacontract-1.2.1.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.0.1.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.0.2.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.1.0.init.yaml +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/schemas/odcs-3.1.0.schema.json +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/datacontract.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/datacontract_odcs.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_information.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_servicelevels.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/datacontract_terms.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/definition.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/example.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/model_field.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/quality.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/partials/server.html +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/templates/style/output.css +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/dependency_links.txt +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/entry_points.txt +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract_cli.egg-info/top_level.txt +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/setup.cfg +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_api.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_bigquery_soda_connection.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_cli.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_data_contract_specification.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_description_linter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_download_datacontract_file.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_duckdb_json.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_avro.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_avro_idl.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_bigquery.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_complex_data_contract.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_custom.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_custom_exporter.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_data_caterer.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbml.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_models.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_sources.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dbt_staging_sql.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_dqx.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_excel.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_go.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_great_expectations.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_html.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_iceberg.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_jsonschema.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_markdown.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_mermaid.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_odcs_v3.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_protobuf.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_pydantic.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_rdf.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sodacl.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_spark.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_export_sqlalchemy.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_avro.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_bigquery.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_csv.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_dbml.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_dbt.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_excel.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_glue.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_iceberg.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_json.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_jsonschema.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_odcs_v3.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_protobuf.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_spark.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_import_unity_file.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_integration_entropydata.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_lint.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_resolve.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_roundtrip_jsonschema.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_sqlserver_soda_connection.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_api.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_athena_iceberg.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_azure_remote.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_bigquery.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_databricks.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_dataframe.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_delta.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_gcs_csv_remote.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_gcs_json_remote.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_kafka.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_kafka_remote.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_local_json.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_local_json_nd.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_oracle.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_output_json.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_output_junit.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_parquet.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_postgres.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_quality.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_csv.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_delta.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_complex.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_multiple_models.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_s3_json_remote.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_schema_evolution.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_snowflake.py +0 -0
- {datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/tests/test_test_sqlserver.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
{datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/data_contract_checks.py
RENAMED
|
@@ -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
|
|
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): [
|
{datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/engines/soda/check_soda_execute.py
RENAMED
|
@@ -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
|
|
@@ -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
|
-
|
|
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:
|
{datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/export/sql_type_converter.py
RENAMED
|
@@ -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
|
|
{datacontract_cli-0.11.6 → datacontract_cli-0.11.7}/datacontract/imports/parquet_importer.py
RENAMED
|
@@ -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",
|