Skip to content

Releases: datacontract/datacontract-cli

v1.1.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 12:25

[1.1.1] - 2026-08-14

Added

  • SQL quality rules support the ${dataset}, ${project}, ${catalog}, and ${database} placeholders for the server's values
  • datacontract test --metadata-only runs only checks that read the schema (field presence and types) and reports checks that read row values as skipped
  • datacontract test --checks accepts the ODCS terms properties and slaProperties, keeping schema and servicelevel as legacy aliases
  • Released Docker images are signed with cosign keyless signing, on Docker Hub and the Amazon ECR Public mirror; see Installation for how to verify them
  • datacontract import pydantic-model creates a data contract from Pydantic models

Changed

  • datacontract export excel uses the ODCS Excel template bundled with the CLI instead of downloading it, so the export works offline; use --template for a custom template
  • The OpenAPI document of datacontract api reports the CLI version, describes every endpoint, parameter, and response model, and names its operations testDataContract, lintDataContract, exportDataContract, and changelogBetweenDataContracts
  • DATACONTRACT_CLI_API_KEY now also protects POST /lint and POST /export, which previously answered without an API key
  • Test results name the check fields qualityId and failedSamples instead of quality_id and failed_samples; the old names are deprecated, but still accepted as input and still written next to the new ones
  • datacontract import unity no longer writes the databricksType custom property, which duplicated physicalType
  • datacontract export sql --server databricks keeps the declared length of varchar(n) and char(n) instead of exporting STRING

Fixed

  • datacontract test for API servers with delimiter: array no longer fails JSON schema validation with data must be object (#1495)
  • POST /export answers 422 instead of 500 when the posted data contract cannot be parsed
  • datacontract test for Databricks no longer fails all checks of a model with a GEOGRAPHY or GEOMETRY column (#1483)
  • datacontract export pydantic-model no longer emits an unparseable empty class for an object property without properties

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 04 Aug 10:38

[1.1.0] - 2026-08-04

This release drops the pyspark compile-time dependency. The server types dataframe and databricks still work with a provided Spark session.
This removes the JVM dependency, makes the images much, much smaller (Docker image from 777 MB to 277 MB), and many CVEs are resolved.

Added

  • DATACONTRACT_KAFKA_MAX_MESSAGES limits how many messages datacontract test reads from a topic, and DATACONTRACT_KAFKA_TIMEOUT how long it waits for one

Changed

  • datacontract test for Kafka no longer needs PySpark or a Java runtime: datacontract-cli[kafka] now installs confluent-kafka, fastavro, and DuckDB instead
  • datacontract-cli[databricks] and datacontract-cli[dataframe] no longer install PySpark, so they can no longer shadow the build a Databricks Runtime or EMR cluster provides; supply your own PySpark for the Spark session these server types take, and databricks-runtime is now an alias of databricks
  • datacontract-cli[all] installs no PySpark at all, and so needs no Java runtime
  • The Docker image ships no JRE and uses a shell-less base image; a derived image can no longer RUN pip install, so datacontract dbt test, which needs a dbt adapter, is not available in the container
  • datacontract import unity resolves struct and array columns into nested properties without PySpark installed
  • spark_exporter.to_spark_schema(), to_struct_type(), to_struct_field(), and to_spark_data_type() return the exporter's own SparkDataType instead of pyspark.sql.types objects; use to_spark_dict() or the new to_pyspark_schema() for real PySpark schemas
  • Kafka topics with an Avro union of more than one non-null type are now reported as an error instead of being decoded into a struct of the union's members
  • Kafka messages without a value (compaction tombstones) are skipped instead of being checked as a row of nulls

Fixed

  • datacontract export spark and datacontract export great-expectations --engine spark no longer require PySpark to be installed
  • spark_exporter.to_spark_dict() reports which PySpark version lacks a type instead of raising a bare AttributeError, e.g. VariantType before PySpark 4.0
  • datacontract test for Databricks no longer creates ibis's memtable staging volume, so read-only service principals without CREATE VOLUME permission can run tests

v1.0.17

Choose a tag to compare

@github-actions github-actions released this 01 Aug 19:06

[1.0.17] - 2026-08-01

Deprecated

  • DATAMESH_MANAGER_API_KEY, DATAMESH_MANAGER_HOST, DATACONTRACT_MANAGER_API_KEY, and DATACONTRACT_MANAGER_HOST (and the matching Config fields): use ENTROPY_DATA_API_KEY and ENTROPY_DATA_HOST instead

Added

  • datacontract export html fits to datacontract-editor visualization
  • datacontract test --filter and --filters test only the rows matching a SQL predicate, e.g., the latest partition; also available as filter/filters query parameters on the API server's POST /test (#1463)
  • Credentials and connection options can be passed programmatically via DataContract(config=...) and DataContract.import_from_source(..., config=...), using the typed datacontract.Config class or a dict keyed by the environment variable names
  • The API server accepts per-request credentials on POST /test via datacontract-* headers (e.g. datacontract-snowflake-password)
  • Credentials and connection options can be provided in a YAML config file, via --config-file (defaults to ./datacontract-config.yaml or ~/.datacontract/config.yaml) or Config.from_yaml(), with ${VAR} references resolved from the environment
  • New Snowflake connection options: DATACONTRACT_SNOWFLAKE_TOKEN, DATACONTRACT_SNOWFLAKE_PASSCODE, DATACONTRACT_SNOWFLAKE_PRIVATE_KEY, DATACONTRACT_SNOWFLAKE_NETWORK_TIMEOUT, DATACONTRACT_SNOWFLAKE_SOCKET_TIMEOUT, DATACONTRACT_SNOWFLAKE_HOST, DATACONTRACT_SNOWFLAKE_PORT
  • Config options to override the server details from the data contract (host, port, database, schema, catalog, project, dataset, account, service name, staging directory) for Postgres, MySQL, SQL Server, Oracle, Redshift, Snowflake, BigQuery, Databricks, Trino, Athena, and Impala, e.g. DATACONTRACT_POSTGRES_HOST (#1076)
  • Data contract locations now support s3:// URLs for commands that read contracts, including lint, test, export, publish, changelog, and ci

Changed

  • datacontract test against Snowflake only forwards the documented DATACONTRACT_SNOWFLAKE_* options to the connector; unknown variables are ignored with a warning
  • DATACONTRACT_SNOWFLAKE_ACCOUNT overrides the contract's account instead of being ignored with a warning
  • DATACONTRACT_DATABRICKS_SERVER_HOSTNAME overrides the contract's host; previously the contract value won when both were set

Fixed

  • datacontract dbt sync writes a description on all dbt tests, not only newly-generated ones

v1.0.16

Choose a tag to compare

@github-actions github-actions released this 31 Jul 12:58

[1.0.16] - 2026-07-31

Added

  • datacontract test reads the Avro schema of a Kafka topic from the Confluent Schema Registry via DATACONTRACT_KAFKA_SCHEMA_REGISTRY_URL, DATACONTRACT_KAFKA_SCHEMA_REGISTRY_USERNAME, and DATACONTRACT_KAFKA_SCHEMA_REGISTRY_PASSWORD (#1347)

Deprecated

  • DATACONTRACT_SNOWFLAKE_PRIVATE_KEY_PATH, DATACONTRACT_SNOWFLAKE_PRIVATE_KEY_PASSPHRASE, and DATACONTRACT_SNOWFLAKE_CONNECTION_TIMEOUT: use DATACONTRACT_SNOWFLAKE_PRIVATE_KEY_FILE, DATACONTRACT_SNOWFLAKE_PRIVATE_KEY_FILE_PWD, and DATACONTRACT_SNOWFLAKE_LOGIN_TIMEOUT instead
  • DATACONTRACT_SQLSERVER_TRUSTED_CONNECTION: use DATACONTRACT_SQLSERVER_AUTHENTICATION=windows instead

Fixed

  • datacontract test against a Kafka topic reports Avro messages it cannot decode as such, instead of reading every field as null (#1347)
  • datacontract test connects to Databricks with an OAuth service principal again, instead of failing with Error during request to server on databricks-sql-connector 4.3.0 and later (#1389)
  • DATACONTRACT_SQLSERVER_TRUSTED_CONNECTION no longer overrides an explicitly set DATACONTRACT_SQLSERVER_AUTHENTICATION, so a leftover flag cannot silently downgrade an Entra ID login to Windows authentication
  • datacontract test passes DATACONTRACT_IMPALA_AUTH_MECHANISM, DATACONTRACT_IMPALA_USE_HTTP_TRANSPORT, and DATACONTRACT_IMPALA_HTTP_PATH to Impala again, so a Cloudera Virtual Warehouse can be reached instead of failing with TSocket read 0 bytes
  • datacontract test passes the servers block catalog to Athena again, instead of always querying awsdatacatalog
  • datacontract test supports DATACONTRACT_BIGQUERY_IMPERSONATION_ACCOUNT again to impersonate a service account
  • datacontract test applies the documented Snowflake key-pair and timeout variables instead of silently ignoring them: the names they were documented under are not accepted by the Snowflake driver, and now map to the ones that are
  • datacontract dbt sync does not assume severity: warn as default anymore: tests now fail with dbt's default severity unless the contract declares a non-blocking quality.severity
  • datacontract dbt sync no longer drops or misplaces YAML comments that introduce the next column, test, or key

v1.0.15

Choose a tag to compare

@github-actions github-actions released this 30 Jul 08:41

[1.0.15] - 2026-07-30

Added

  • datacontract test treats a server typed mssql as SQL Server, so contracts carrying the ODBC/dbt spelling are testable (ODCS itself only defines sqlserver)
  • datacontract test --quality-id runs a single quality rule by its ODCS quality.id, and --tag runs every quality rule declaring one of the given quality.tags (#1080)
  • Test results report the quality_id and tags of the quality rule a check comes from
  • New databricks-runtime extra for installing inside a Databricks Runtime, where the cluster already provides PySpark: pip install datacontract-cli[databricks-runtime] (#1211 @chifu1234)
  • The docs Commands reference documents the global options --version and --system-truststore, and every import and export guide links to its command page and back
  • datacontract test --dimension runs only the checks measuring one data quality dimension, e.g. --dimension uniqueness; it matches the ODCS quality.dimension of a rule and the schema and service level checks that measure the same aspect
  • New dataframe extra installs just what testing Spark DataFrames needs: pip install datacontract-cli[dataframe]
  • datacontract import trino creates a data contract from a Trino catalog, including a ready-to-test servers block
  • datacontract import oracle creates a data contract from a live Oracle database, including a ready-to-test servers block
  • datacontract import gcs and datacontract import adls create a data contract from files in Google Cloud Storage or Azure Blob Storage, including a ready-to-test servers block
  • datacontract import sqlserver creates a data contract from a live SQL Server database, including a ready-to-test servers block
  • datacontract import mysql creates a data contract from a live MySQL database, including a ready-to-test servers block
  • The documentation has a Release Notes page, generated from this changelog
  • The documentation has a guide to migrate contracts from DCS to ODCS
  • datacontract import s3 creates a data contract from files in an S3 bucket, including a ready-to-test servers block
  • datacontract import athena creates a data contract from an Amazon Athena database, including a ready-to-test servers block
  • datacontract import unity is now datacontract import databricks; the unity format name keeps working
  • Redshift infers the authentication method: a password means a database login, otherwise your AWS session is used for IAM. DATACONTRACT_REDSHIFT_AUTHENTICATION is no longer required and remains as an override
  • datacontract import postgres creates a data contract from a live Postgres schema, including a ready-to-test servers block
  • datacontract import redshift creates a data contract from an Amazon Redshift schema, including a ready-to-test servers block
  • Redshift supports IAM authentication, using temporary credentials from your AWS session instead of a database password
  • datacontract import bigquery now generates a servers block, so datacontract test works right after the import
  • datacontract test verifies declared primary keys: each key column must have no missing values, and the key must have no duplicates (a composite key is checked as a tuple) (#1220 @DMZ22)

Fixed

  • datacontract test checked physicalType against a same-named table in another schema when one existed, because the native column types were read from the catalog without the contract's schema
  • datacontract test against SQL Server no longer fails every check with "Could not read model" when server.schema differs from the login's default schema
  • datacontract-cli[s3] could not run datacontract test, and datacontract-cli[gcs] was missing the AWS duckdb extension the GCS connection loads; each data source extra now installs everything its guide needs
  • The API testing guide stated that no extra is required, but the response is tested with duckdb; it installs datacontract-cli[duckdb] now
  • datacontract test told users to install datacontract-cli[local], an extra that does not exist, and datacontract-cli[api], which installs the web server rather than a test backend; both now point at duckdb
  • datacontract import gcs wrote type: gcs, which is not an ODCS server type, so the imported contract failed datacontract lint and datacontract test; GCS is now written as an s3 server on the Google interoperability endpoint
  • A data contract could inject SQL into the duckdb session through endpointUrl, which is interpolated into the statement that stores the S3, GCS and Azure credentials; every value is escaped now
  • The datacontract api server accepted a local file path as the schema query parameter, so a caller could have it read files from the server's filesystem; only http(s) URLs are accepted now
  • Trino physical type checks were silently skipped: its information_schema has no length or precision columns, so the catalog query failed and a wrong physicalType still passed
  • datacontract import athena and datacontract import glue now honour DATACONTRACT_S3_ACCESS_KEY_ID and DATACONTRACT_S3_SECRET_ACCESS_KEY; the Glue catalog was read with ambient AWS credentials only
  • S3 now uses an existing AWS session (aws sso login, AWS_PROFILE, instance roles) when no access key is configured; previously such a setup failed with 403 Forbidden
  • Documented that Athena authenticates with an existing AWS session (aws sso login, AWS_PROFILE, instance roles); static access keys were presented as the only option
  • regionName in an Athena servers block was ignored, so the region could only be set via DATACONTRACT_S3_REGION
  • datacontract import glue mapped timestamp columns to logicalType: date instead of timestamp
  • Testing and importing Redshift failed with codec not available in Python: 'UNICODE'
  • Error messages no longer drop bracketed text such as pip install "botocore[crt]"
  • BigQuery export failed on fields with logicalType: time
  • Testing Parquet files failed for number fields without a declared precision and scale
  • CSV and JSON imports now write detected formats (email, uuid, date-time) to logicalTypeOptions.format instead of a custom property, so they are validated by datacontract test
  • SQL imports now map TIME types with precision or time zone (e.g. TIME(9)) to logicalType: time; previously the logical type was left unset
  • datacontract test --checks quality now runs rowCount quality rules, which were wrongly categorized as schema checks
  • datacontract import dbt derives the contract id from the dbt manifest's project_name instead of always emitting the placeholder my-data-contract (#1221 @DMZ22)
  • A physicalType declaring a zero scale (NUMBER(38,0), decimal(18,0)) failed against its own column on Snowflake, Oracle, SQL Server and Databricks (#1377 @DMZ22)
  • Snowflake physicalType checks failed for structured OBJECT, ARRAY and MAP columns, whose fields are now compared field by field instead of as rendered strings (#1377 @DMZ22)
  • datacontract test on Athena failed a physicalType written in the Hive spelling datacontract import athena produces (array<string> against the reported array(varchar)) (#1377 @DMZ22)
  • A physicalType declaring fractional seconds (TIMESTAMP_NTZ(9), datetime2(7), timestamp(3)) failed against its own column, so every timestamp column imported from Snowflake failed the first datacontract test
  • datacontract test and datacontract import oracle read Oracle character lengths in bytes, so an NVARCHAR2(50) column was reported and checked as NVARCHAR2(100)
  • datacontract test on Databricks could not check the element types of ARRAY, MAP and STRUCT columns, which the catalog reports as a bare type name

v1.0.14

Choose a tag to compare

@github-actions github-actions released this 23 Jul 17:37

[1.0.14] - 2026-07-23

Added

  • datacontract export protobuf supports a customizable package name via the protoPackageName custom property (#1381 @Schokuroff)
  • datacontract export protobuf emits optional for non-required message/object fields (#1390 @Schokuroff)

Fixed

  • datacontract dbt sync resolves {object}/{property} placeholders in custom sql quality checks to the dbt ref() and column name (#1397)
  • SyntaxWarning during installation: datacontract/lint/resolve.py:72: SyntaxWarning: 'return' in a 'finally' block return except_message is handled properly (#1384 @Cupprum)
  • datacontract test no longer reports "backend is not installed" for Athena and other ibis SQL backends when packaging is missing from the environment

v1.0.13

Choose a tag to compare

@github-actions github-actions released this 14 Jul 18:12

[1.0.13] - 2026-07-14

Added

  • datacontract test reports the nested types of a property that declares properties: or items: as a separate check
  • datacontract test on Snowflake verifies the physicalType of nested properties against the real column type

Fixed

  • datacontract test on Snowflake matches a physicalType against the alias the catalog reports, such as BIGINT on a NUMBER(38,0) column
  • datacontract test no longer reports a mismatch for a physicalType without precision, such as NUMBER on a NUMBER(12,2) column

v1.0.12

Choose a tag to compare

@github-actions github-actions released this 10 Jul 15:59

[1.0.12] - 2026-07-10

Fixed

  • datacontract test now recursively verifies nested logicalType for Snowflake structured OBJECT/ARRAY columns (#1373)
  • datacontract test now fails for complex types when the nested type definition cannot be verified (e.g. if array is required, array will no longer be accepted) (#1373)

Release v1.0.11

Choose a tag to compare

@github-actions github-actions released this 10 Jul 14:51
3189daf

[1.0.11] - 2026-07-09

Added

Fixed

  • Failed business definition IRI lookups now suggest the ENTROPY_DATA_HOST value to set when the IRI host does not match the configured entropy-data host.
  • datacontract test no longer reports a physical type mismatch for BigQuery type aliases, such as a physicalType of INTEGER on an INT64 column (#1371 @fantastisch)
  • datacontract test no longer fails with CANNOT_CONVERT_COLUMN_INTO_BOOL on Databricks when a Spark session is used

v1.0.10

Choose a tag to compare

@github-actions github-actions released this 08 Jul 13:18

[1.0.10] - 2026-07-08

Added

  • extended datacontract dbt sync:
    • now edits existing properties files (schema.yaml) in-place instead of creating new ones
    • preserve manual edits to a properties file
    • edit schema incl. descriptions, column types and tags, not only tests
    • add --prune flag to remove everything that's not specified in the contract (models, tags, checks) - per default, only generated content gets removed
    • support for multiple contract versions (versions: block)
    • possibility to sync multiple contracts at once
    • store the contract id and version in the meta: block
  • added datacontract dbt test: Use local dbt to run all tests that have been generated using datacontract dbt sync earlier (scoped to a single data contract, or all data contracts in the opened dbt project)
    • optionally publish to Entropy Data

Changed

  • datacontract dbt sync:
    • no longer executes tests per default (use --run-tests or run datacontract dbt test afterwards)
  • datacontract test now verifies a field's physicalType against the column's real native type from the platform catalog (length and precision included), taking precedence over logicalType (#1354)
  • datacontract test JSON output now includes datacontractCliVersion (#1353 @hk8suva)
  • datacontract test type-check errors now report the first failing field and a count of the remaining errors (#1334 @jorgengranseth)

Fixed

  • datacontract test no longer fails the type check for SQL Server uniqueidentifier (UUID) columns with "the column type could not be determined" (#1354)
  • datacontract test against BigQuery no longer fails SQL quality checks with 'RowIterator' object has no attribute 'fetchone'
  • datacontract import against BigQuery applies correct logicalType for BigQuery types TIMESTAMP, DATETIME, and TIME (#1366 @fantastisch)