datacontract-cli 0.10.34__py3-none-any.whl → 0.10.36__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (39) hide show
  1. datacontract/api.py +10 -3
  2. datacontract/cli.py +5 -3
  3. datacontract/data_contract.py +18 -51
  4. datacontract/engines/data_contract_checks.py +280 -19
  5. datacontract/engines/fastjsonschema/check_jsonschema.py +29 -19
  6. datacontract/export/dbt_converter.py +30 -4
  7. datacontract/export/dqx_converter.py +126 -0
  8. datacontract/export/excel_exporter.py +3 -3
  9. datacontract/export/exporter.py +1 -0
  10. datacontract/export/exporter_factory.py +6 -0
  11. datacontract/export/markdown_converter.py +35 -16
  12. datacontract/export/mermaid_exporter.py +24 -11
  13. datacontract/export/rdf_converter.py +2 -2
  14. datacontract/export/spark_converter.py +28 -3
  15. datacontract/export/sql_type_converter.py +6 -4
  16. datacontract/imports/odcs_v3_importer.py +100 -19
  17. datacontract/imports/unity_importer.py +16 -11
  18. datacontract/init/init_template.py +1 -1
  19. datacontract/lint/resolve.py +1 -1
  20. datacontract/lint/schema.py +1 -1
  21. datacontract/schemas/datacontract-1.1.0.init.yaml +1 -1
  22. datacontract/schemas/datacontract-1.2.0.init.yaml +1 -1
  23. datacontract/schemas/datacontract-1.2.1.init.yaml +91 -0
  24. datacontract/schemas/datacontract-1.2.1.schema.json +2058 -0
  25. datacontract/schemas/odcs-3.0.2.schema.json +2382 -0
  26. datacontract/templates/datacontract_odcs.html +60 -41
  27. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/METADATA +68 -56
  28. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/RECORD +32 -35
  29. datacontract/lint/lint.py +0 -142
  30. datacontract/lint/linters/__init__.py +0 -0
  31. datacontract/lint/linters/description_linter.py +0 -33
  32. datacontract/lint/linters/field_pattern_linter.py +0 -34
  33. datacontract/lint/linters/field_reference_linter.py +0 -47
  34. datacontract/lint/linters/notice_period_linter.py +0 -55
  35. datacontract/lint/linters/valid_constraints_linter.py +0 -100
  36. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/WHEEL +0 -0
  37. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/entry_points.txt +0 -0
  38. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/licenses/LICENSE +0 -0
  39. {datacontract_cli-0.10.34.dist-info → datacontract_cli-0.10.36.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,61 @@
1
+ {% macro render_nested_properties(properties, level) %}
2
+ <tr>
3
+ {% for property in properties %}
4
+ <td class="px-4 py-4 whitespace-nowrap">
5
+
6
+ <div class="text-sm font-medium text-gray-900">
7
+ {% for i in range(0,level)%}
8
+ &nbsp;
9
+ {% endfor %}
10
+ {% if level > 0 %}
11
+
12
+ {% endif %}
13
+ {{ property.name or "items" }}</div>
14
+ {% if property.primaryKey %}
15
+ <span
16
+ class="inline-flex items-center rounded-md bg-yellow-50 px-2 py-1 text-xs font-medium text-yellow-800 ring-1 ring-inset ring-yellow-600/20">Primary Key</span>
17
+ {% endif %}
18
+ {% if property.partitioned %}
19
+ <span
20
+ class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-800 ring-1 ring-inset ring-blue-600/20">Partitioned</span>
21
+ {% endif %}
22
+ {% if property.criticalDataElement %}
23
+ <span
24
+ class="inline-flex items-center rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-800 ring-1 ring-inset ring-red-600/20">Critical</span>
25
+ {% endif %}
26
+ </td>
27
+ <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">{{
28
+ property.businessName or "-" }}
29
+ </td>
30
+ <td class="px-4 py-4 whitespace-nowrap">
31
+ <div class="text-sm text-gray-900">{{ property.logicalType }}</div>
32
+ {% if property.physicalType and property.physicalType !=
33
+ property.logicalType %}
34
+ <div class="text-xs text-gray-500">{{ property.physicalType }}</div>
35
+ {% endif %}
36
+ </td>
37
+ <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
38
+ {% if property.required %}
39
+ <span class="text-green-600">Yes</span>
40
+ {% else %}
41
+ <span class="text-gray-400">No</span>
42
+ {% endif %}
43
+ </td>
44
+ <td class="px-4 py-4 text-sm text-gray-500">{{ property.description or "-"
45
+ }}
46
+ </td>
47
+ </tr>
48
+ {% if property.properties %}
49
+ {{render_nested_properties(property.properties, level+1)}}
50
+ {% endif %}
51
+ {% if property.items %}
52
+ {{render_nested_properties([property.items], level+1)}}
53
+ {% endif %}
54
+ {% endfor %}
55
+ <!-- Mark the end of the contained fields -->
56
+ <tr style="--tw-divide-y-reverse: 2"></tr>
57
+ {% endmacro %}
58
+
1
59
  <!doctype html>
2
60
  <html class="h-full bg-gray-100" lang="en">
3
61
  <head>
@@ -12,7 +70,6 @@
12
70
  </style>
13
71
  </head>
14
72
  <body class="h-full">
15
-
16
73
  <div class="min-h-full flex flex-col">
17
74
 
18
75
  <nav class="bg-white shadow-sm">
@@ -265,45 +322,7 @@
265
322
  </tr>
266
323
  </thead>
267
324
  <tbody class="divide-y divide-gray-200 bg-white">
268
- {% for property in schema.properties %}
269
- <tr>
270
- <td class="px-4 py-4 whitespace-nowrap">
271
- <div class="text-sm font-medium text-gray-900">{{ property.name }}</div>
272
- {% if property.primaryKey %}
273
- <span
274
- class="inline-flex items-center rounded-md bg-yellow-50 px-2 py-1 text-xs font-medium text-yellow-800 ring-1 ring-inset ring-yellow-600/20">Primary Key</span>
275
- {% endif %}
276
- {% if property.partitioned %}
277
- <span
278
- class="inline-flex items-center rounded-md bg-blue-50 px-2 py-1 text-xs font-medium text-blue-800 ring-1 ring-inset ring-blue-600/20">Partitioned</span>
279
- {% endif %}
280
- {% if property.criticalDataElement %}
281
- <span
282
- class="inline-flex items-center rounded-md bg-red-50 px-2 py-1 text-xs font-medium text-red-800 ring-1 ring-inset ring-red-600/20">Critical</span>
283
- {% endif %}
284
- </td>
285
- <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">{{
286
- property.businessName or "-" }}
287
- </td>
288
- <td class="px-4 py-4 whitespace-nowrap">
289
- <div class="text-sm text-gray-900">{{ property.logicalType }}</div>
290
- {% if property.physicalType and property.physicalType !=
291
- property.logicalType %}
292
- <div class="text-xs text-gray-500">{{ property.physicalType }}</div>
293
- {% endif %}
294
- </td>
295
- <td class="px-4 py-4 whitespace-nowrap text-sm text-gray-500">
296
- {% if property.required %}
297
- <span class="text-green-600">Yes</span>
298
- {% else %}
299
- <span class="text-gray-400">No</span>
300
- {% endif %}
301
- </td>
302
- <td class="px-4 py-4 text-sm text-gray-500">{{ property.description or "-"
303
- }}
304
- </td>
305
- </tr>
306
- {% endfor %}
325
+ {{ render_nested_properties(schema.properties, 0) }}
307
326
  </tbody>
308
327
  {% if schema.quality %}
309
328
  <tfoot class="divide-y divide-gray-200 bg-white">
@@ -663,4 +682,4 @@
663
682
  </div>
664
683
 
665
684
  </body>
666
- </html>
685
+ </html>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datacontract-cli
3
- Version: 0.10.34
3
+ Version: 0.10.36
4
4
  Summary: The datacontract CLI is an open source command-line tool for working with Data Contracts. It uses data contract YAML files to lint the data contract, connect to data sources and execute schema and quality tests, detect breaking changes, and export to different formats. The tool is written in Python. It can be used as a standalone CLI tool, in a CI/CD pipeline, or directly as a Python library.
5
5
  Author-email: Jochen Christ <jochen.christ@innoq.com>, Stefan Negele <stefan.negele@innoq.com>, Simon Harrer <simon.harrer@innoq.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Classifier: Operating System :: OS Independent
11
11
  Requires-Python: >=3.10
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: typer<0.17,>=0.15.1
14
+ Requires-Dist: typer<0.20,>=0.15.1
15
15
  Requires-Dist: pydantic<2.12.0,>=2.8.2
16
16
  Requires-Dist: pyyaml~=6.0.1
17
17
  Requires-Dist: requests<2.33,>=2.31
@@ -28,7 +28,7 @@ Requires-Dist: python-dotenv<2.0.0,>=1.0.0
28
28
  Requires-Dist: boto3<2.0.0,>=1.34.41
29
29
  Requires-Dist: Jinja2<4.0.0,>=3.1.5
30
30
  Requires-Dist: jinja_partials<1.0.0,>=0.2.1
31
- Requires-Dist: datacontract-specification<2.0.0,>=1.2.0
31
+ Requires-Dist: datacontract-specification<2.0.0,>=1.2.3
32
32
  Requires-Dist: open-data-contract-standard<4.0.0,>=3.0.4
33
33
  Provides-Extra: avro
34
34
  Requires-Dist: avro==1.12.0; extra == "avro"
@@ -42,7 +42,7 @@ Provides-Extra: databricks
42
42
  Requires-Dist: soda-core-spark-df<3.6.0,>=3.3.20; extra == "databricks"
43
43
  Requires-Dist: soda-core-spark[databricks]<3.6.0,>=3.3.20; extra == "databricks"
44
44
  Requires-Dist: databricks-sql-connector<4.1.0,>=3.7.0; extra == "databricks"
45
- Requires-Dist: databricks-sdk<0.61.0; extra == "databricks"
45
+ Requires-Dist: databricks-sdk<0.68.0; extra == "databricks"
46
46
  Requires-Dist: pyspark<4.0.0,>=3.5.5; extra == "databricks"
47
47
  Provides-Extra: iceberg
48
48
  Requires-Dist: pyiceberg==0.9.1; extra == "iceberg"
@@ -54,9 +54,9 @@ Provides-Extra: postgres
54
54
  Requires-Dist: soda-core-postgres<3.6.0,>=3.3.20; extra == "postgres"
55
55
  Provides-Extra: s3
56
56
  Requires-Dist: s3fs<2026.0.0,>=2025.2.0; extra == "s3"
57
- Requires-Dist: aiobotocore<2.24.0,>=2.17.0; extra == "s3"
57
+ Requires-Dist: aiobotocore<2.25.0,>=2.17.0; extra == "s3"
58
58
  Provides-Extra: snowflake
59
- Requires-Dist: snowflake-connector-python[pandas]<3.17,>=3.6; extra == "snowflake"
59
+ Requires-Dist: snowflake-connector-python[pandas]<4.1,>=3.6; extra == "snowflake"
60
60
  Requires-Dist: soda-core-snowflake<3.6.0,>=3.3.20; extra == "snowflake"
61
61
  Provides-Extra: sqlserver
62
62
  Requires-Dist: soda-core-sqlserver<3.6.0,>=3.3.20; extra == "sqlserver"
@@ -83,15 +83,15 @@ Provides-Extra: dev
83
83
  Requires-Dist: datacontract-cli[all]; extra == "dev"
84
84
  Requires-Dist: httpx==0.28.1; extra == "dev"
85
85
  Requires-Dist: kafka-python; extra == "dev"
86
- Requires-Dist: moto==5.1.8; extra == "dev"
86
+ Requires-Dist: moto==5.1.13; extra == "dev"
87
87
  Requires-Dist: pandas>=2.1.0; extra == "dev"
88
- Requires-Dist: pre-commit<4.3.0,>=3.7.1; extra == "dev"
88
+ Requires-Dist: pre-commit<4.4.0,>=3.7.1; extra == "dev"
89
89
  Requires-Dist: pytest; extra == "dev"
90
90
  Requires-Dist: pytest-xdist; extra == "dev"
91
91
  Requires-Dist: pymssql==2.3.7; extra == "dev"
92
92
  Requires-Dist: ruff; extra == "dev"
93
93
  Requires-Dist: testcontainers[kafka,minio,mssql,postgres]==4.12.0; extra == "dev"
94
- Requires-Dist: trino==0.335.0; extra == "dev"
94
+ Requires-Dist: trino==0.336.0; extra == "dev"
95
95
  Dynamic: license-file
96
96
 
97
97
  # Data Contract CLI
@@ -119,9 +119,9 @@ We have a _servers_ section with endpoint details to the S3 bucket, _models_ for
119
119
 
120
120
  This data contract contains all information to connect to S3 and check that the actual data meets the defined schema and quality requirements. We can use this information to test if the actual data product in S3 is compliant to the data contract.
121
121
 
122
- Let's use [pip](https://pip.pypa.io/en/stable/getting-started/) to install the CLI (or use the [Docker image](#docker)),
122
+ Let's use [uv](https://docs.astral.sh/uv/) to install the CLI (or use the [Docker image](#docker)),
123
123
  ```bash
124
- $ python3 -m pip install 'datacontract-cli[all]'
124
+ $ uv tool install --python python3.11 'datacontract-cli[all]'
125
125
  ```
126
126
 
127
127
 
@@ -257,6 +257,14 @@ if not run.has_passed():
257
257
 
258
258
  Choose the most appropriate installation method for your needs:
259
259
 
260
+ ### uv
261
+
262
+ If you have [uv](https://docs.astral.sh/uv/) installed, you can run datacontract-cli directly without installing:
263
+
264
+ ```
265
+ uv run --with 'datacontract-cli[all]' datacontract --version
266
+ ```
267
+
260
268
  ### pip
261
269
  Python 3.10, 3.11, and 3.12 are supported. We recommend to use Python 3.11.
262
270
 
@@ -1011,7 +1019,7 @@ models:
1011
1019
  │ terraform|avro-idl|sql|sql-query|mer │
1012
1020
  │ maid|html|go|bigquery|dbml|spark|sql │
1013
1021
  │ alchemy|data-caterer|dcs|markdown|ic │
1014
- │ eberg|custom|excel] │
1022
+ │ eberg|custom|excel|dqx] │
1015
1023
  │ --output PATH Specify the file path where the │
1016
1024
  │ exported data will be saved. If no │
1017
1025
  │ path is provided, the output will be │
@@ -1057,35 +1065,36 @@ datacontract export --format html --output datacontract.html
1057
1065
 
1058
1066
  Available export options:
1059
1067
 
1060
- | Type | Description | Status |
1061
- |----------------------|---------------------------------------------------------|--------|
1062
- | `html` | Export to HTML | ✅ |
1063
- | `jsonschema` | Export to JSON Schema | ✅ |
1064
- | `odcs` | Export to Open Data Contract Standard (ODCS) V3 | ✅ |
1065
- | `sodacl` | Export to SodaCL quality checks in YAML format | ✅ |
1066
- | `dbt` | Export to dbt models in YAML format | ✅ |
1067
- | `dbt-sources` | Export to dbt sources in YAML format | ✅ |
1068
- | `dbt-staging-sql` | Export to dbt staging SQL models | ✅ |
1069
- | `rdf` | Export data contract to RDF representation in N3 format | ✅ |
1070
- | `avro` | Export to AVRO models | ✅ |
1071
- | `protobuf` | Export to Protobuf | ✅ |
1072
- | `terraform` | Export to terraform resources | ✅ |
1073
- | `sql` | Export to SQL DDL | ✅ |
1074
- | `sql-query` | Export to SQL Query | ✅ |
1075
- | `great-expectations` | Export to Great Expectations Suites in JSON Format | ✅ |
1076
- | `bigquery` | Export to BigQuery Schemas | ✅ |
1077
- | `go` | Export to Go types | ✅ |
1078
- | `pydantic-model` | Export to pydantic models | ✅ |
1079
- | `DBML` | Export to a DBML Diagram description | ✅ |
1080
- | `spark` | Export to a Spark StructType | ✅ |
1081
- | `sqlalchemy` | Export to SQLAlchemy Models | ✅ |
1082
- | `data-caterer` | Export to Data Caterer in YAML format | ✅ |
1083
- | `dcs` | Export to Data Contract Specification in YAML format | ✅ |
1084
- | `markdown` | Export to Markdown | ✅ |
1068
+ | Type | Description | Status |
1069
+ |----------------------|---------------------------------------------------------|---------|
1070
+ | `html` | Export to HTML | ✅ |
1071
+ | `jsonschema` | Export to JSON Schema | ✅ |
1072
+ | `odcs` | Export to Open Data Contract Standard (ODCS) V3 | ✅ |
1073
+ | `sodacl` | Export to SodaCL quality checks in YAML format | ✅ |
1074
+ | `dbt` | Export to dbt models in YAML format | ✅ |
1075
+ | `dbt-sources` | Export to dbt sources in YAML format | ✅ |
1076
+ | `dbt-staging-sql` | Export to dbt staging SQL models | ✅ |
1077
+ | `rdf` | Export data contract to RDF representation in N3 format | ✅ |
1078
+ | `avro` | Export to AVRO models | ✅ |
1079
+ | `protobuf` | Export to Protobuf | ✅ |
1080
+ | `terraform` | Export to terraform resources | ✅ |
1081
+ | `sql` | Export to SQL DDL | ✅ |
1082
+ | `sql-query` | Export to SQL Query | ✅ |
1083
+ | `great-expectations` | Export to Great Expectations Suites in JSON Format | ✅ |
1084
+ | `bigquery` | Export to BigQuery Schemas | ✅ |
1085
+ | `go` | Export to Go types | ✅ |
1086
+ | `pydantic-model` | Export to pydantic models | ✅ |
1087
+ | `DBML` | Export to a DBML Diagram description | ✅ |
1088
+ | `spark` | Export to a Spark StructType | ✅ |
1089
+ | `sqlalchemy` | Export to SQLAlchemy Models | ✅ |
1090
+ | `data-caterer` | Export to Data Caterer in YAML format | ✅ |
1091
+ | `dcs` | Export to Data Contract Specification in YAML format | ✅ |
1092
+ | `markdown` | Export to Markdown | ✅ |
1085
1093
  | `iceberg` | Export to an Iceberg JSON Schema Definition | partial |
1086
- | `excel` | Export to ODCS Excel Template | ✅ |
1087
- | `custom` | Export to Custom format with Jinja | ✅ |
1088
- | Missing something? | Please create an issue on GitHub | TBD |
1094
+ | `excel` | Export to ODCS Excel Template | ✅ |
1095
+ | `custom` | Export to Custom format with Jinja | ✅ |
1096
+ | `dqx` | Export to DQX in YAML format | |
1097
+ | Missing something? | Please create an issue on GitHub | TBD |
1089
1098
 
1090
1099
  #### SQL
1091
1100
 
@@ -1531,18 +1540,22 @@ datacontract import --format bigquery --bigquery-project <project_id> --bigquery
1531
1540
  ```
1532
1541
 
1533
1542
  #### Unity Catalog
1534
-
1535
1543
  ```bash
1536
1544
  # Example import from a Unity Catalog JSON file
1537
1545
  datacontract import --format unity --source my_unity_table.json
1538
1546
  ```
1539
1547
 
1540
1548
  ```bash
1541
- # Example import single table from Unity Catalog via HTTP endpoint
1549
+ # Example import single table from Unity Catalog via HTTP endpoint using PAT
1542
1550
  export DATACONTRACT_DATABRICKS_SERVER_HOSTNAME="https://xyz.cloud.databricks.com"
1543
- export DATACONTRACT_DATABRICKS_HTTP_PATH="/sql/1.0/warehouses/b053a331fa014fb4"
1544
1551
  export DATACONTRACT_DATABRICKS_TOKEN=<token>
1545
1552
  datacontract import --format unity --unity-table-full-name <table_full_name>
1553
+ ```
1554
+ Please Refer to [Databricks documentation](https://docs.databricks.com/aws/en/dev-tools/auth/unified-auth) on how to set up a profile
1555
+ ```bash
1556
+ # Example import single table from Unity Catalog via HTTP endpoint using Profile
1557
+ export DATACONTRACT_DATABRICKS_PROFILE="my-profile"
1558
+ datacontract import --format unity --unity-table-full-name <table_full_name>
1546
1559
  ```
1547
1560
 
1548
1561
  #### dbt
@@ -1601,20 +1614,20 @@ datacontract import --format spark --source "users,orders"
1601
1614
 
1602
1615
  ```bash
1603
1616
  # Example: Import Spark table
1604
- DataContract().import_from_source("spark", "users")
1605
- DataContract().import_from_source(format = "spark", source = "users")
1617
+ DataContract.import_from_source("spark", "users")
1618
+ DataContract.import_from_source(format = "spark", source = "users")
1606
1619
 
1607
1620
  # Example: Import Spark dataframe
1608
- DataContract().import_from_source("spark", "users", dataframe = df_user)
1609
- DataContract().import_from_source(format = "spark", source = "users", dataframe = df_user)
1621
+ DataContract.import_from_source("spark", "users", dataframe = df_user)
1622
+ DataContract.import_from_source(format = "spark", source = "users", dataframe = df_user)
1610
1623
 
1611
1624
  # Example: Import Spark table + table description
1612
- DataContract().import_from_source("spark", "users", description = "description")
1613
- DataContract().import_from_source(format = "spark", source = "users", description = "description")
1625
+ DataContract.import_from_source("spark", "users", description = "description")
1626
+ DataContract.import_from_source(format = "spark", source = "users", description = "description")
1614
1627
 
1615
1628
  # Example: Import Spark dataframe + table description
1616
- DataContract().import_from_source("spark", "users", dataframe = df_user, description = "description")
1617
- DataContract().import_from_source(format = "spark", source = "users", dataframe = df_user, description = "description")
1629
+ DataContract.import_from_source("spark", "users", dataframe = df_user, description = "description")
1630
+ DataContract.import_from_source(format = "spark", source = "users", dataframe = df_user, description = "description")
1618
1631
  ```
1619
1632
 
1620
1633
  #### DBML
@@ -1859,8 +1872,7 @@ Create a data contract based on the actual data. This is the fastest way to get
1859
1872
  $ datacontract test
1860
1873
  ```
1861
1874
 
1862
- 3. Make sure that all the best practices for a `datacontract.yaml` are met using the linter. You
1863
- probably forgot to document some fields and add the terms and conditions.
1875
+ 3. Validate that the `datacontract.yaml` is correctly formatted and adheres to the Data Contract Specification.
1864
1876
  ```bash
1865
1877
  $ datacontract lint
1866
1878
  ```
@@ -1881,8 +1893,7 @@ Create a data contract based on the requirements from use cases.
1881
1893
  ```
1882
1894
 
1883
1895
  2. Create the model and quality guarantees based on your business requirements. Fill in the terms,
1884
- descriptions, etc. Make sure you follow all best practices for a `datacontract.yaml` using the
1885
- linter.
1896
+ descriptions, etc. Validate that your `datacontract.yaml` is correctly formatted.
1886
1897
  ```bash
1887
1898
  $ datacontract lint
1888
1899
  ```
@@ -2076,7 +2087,7 @@ if __name__ == "__main__":
2076
2087
  Output
2077
2088
 
2078
2089
  ```yaml
2079
- dataContractSpecification: 1.2.0
2090
+ dataContractSpecification: 1.2.1
2080
2091
  id: uuid-custom
2081
2092
  info:
2082
2093
  title: my_custom_imported_data
@@ -2102,6 +2113,7 @@ models:
2102
2113
  ```bash
2103
2114
  # make sure uv is installed
2104
2115
  uv python pin 3.11
2116
+ uv venv
2105
2117
  uv pip install -e '.[dev]'
2106
2118
  uv run ruff check
2107
2119
  uv run pytest
@@ -1,18 +1,18 @@
1
1
  datacontract/__init__.py,sha256=ThDdxDJsd7qNErLoh628nK5M7RzhJNYCmN-C6BAJFoo,405
2
- datacontract/api.py,sha256=Ze6pVD3Ub0oyMJI3iYSNXH78K2nPKbXKKHA-0DerJ48,8175
3
- datacontract/cli.py,sha256=MxtTI15tnkPieSbHdqtU-wCiwj1oCiEnlMHFGzB4OUg,19364
4
- datacontract/data_contract.py,sha256=Jlgkbzj6UN8RtFDK5VFcqm7v8oitVs-q10msU8W3Uo8,15183
2
+ datacontract/api.py,sha256=nFmrJOhC5AygY9YS1VXsbvKNtW92B8AF-lXdhuCvcPE,8578
3
+ datacontract/cli.py,sha256=fdO2n9NaJPJCx_IgNDjquMyOisOaFokBF4q8RXnQ_Bo,19399
4
+ datacontract/data_contract.py,sha256=24QE2ym5dfwTP6vJ0OmW37GNfGCCV6y4x4-J5Ouvfjk,13248
5
5
  datacontract/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  datacontract/breaking/breaking.py,sha256=DnqgxUjD-EAZcg5RBizOP9a2WxsFTaQBik0AB_m3K00,20431
7
7
  datacontract/breaking/breaking_change.py,sha256=BIDEUo1U2CQLVT2-I5PyFttxAj6zQPI1UUkEoOOQXMY,2249
8
8
  datacontract/breaking/breaking_rules.py,sha256=M9IdzVJSA7oOr1fvLQl0y9MoBKeItPz42Db2U2cjH2Y,4063
9
9
  datacontract/catalog/catalog.py,sha256=HyFmUPsN3pWJ2WTdbs0DmOf0qmwAzc2-ijWse9_dhBc,2729
10
10
  datacontract/engines/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
- datacontract/engines/data_contract_checks.py,sha256=NbYz7p9ljnia2XiF6PeWR4UNiZVpCAj2ufKgpir-Ve4,28234
11
+ datacontract/engines/data_contract_checks.py,sha256=LNI0OZPrzrf7sn6lPgTL4uAHSqMH2VBrmaBo8etuSE0,37453
12
12
  datacontract/engines/data_contract_test.py,sha256=8qg0SkwtTmayfzNL2U_0xgx5Hi_DUePaMt2q_JiCqX8,4543
13
13
  datacontract/engines/datacontract/check_that_datacontract_contains_valid_servers_configuration.py,sha256=zrDn-_EJJ5kv0kZWAA-toeEPuBd3YQ0-U7Jb8euNUS8,1558
14
14
  datacontract/engines/datacontract/check_that_datacontract_file_exists.py,sha256=Vw-7U0GmQT2127tybxggZfpRFiZVgoIh6ndkTGM0FP4,665
15
- datacontract/engines/fastjsonschema/check_jsonschema.py,sha256=zjTEHNyPdh1hhStvpImjqKXjsz97AAkbNzoWF-pWgJE,10603
15
+ datacontract/engines/fastjsonschema/check_jsonschema.py,sha256=EKPkFM8iGyiWsHw8peErhQvbt9gu_zJ2S-NDQnupfeM,10921
16
16
  datacontract/engines/fastjsonschema/s3/s3_read_files.py,sha256=0sTDWvuu0AzSgn7fKWJxGaTmPww00TFYyDK-X0s5T3c,1193
17
17
  datacontract/engines/soda/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
18
  datacontract/engines/soda/check_soda_execute.py,sha256=qc56ZNKyHIoSFgoXzBRioOhnhgsFSJ6L-nyBU7d0fW8,8902
@@ -32,28 +32,29 @@ datacontract/export/bigquery_converter.py,sha256=9mm-XP3klu1C5J87L9EL5ZyMCJhLBws
32
32
  datacontract/export/custom_converter.py,sha256=xb8KbkRRgHmT4ewwC7XxtnKpe_ZMSJWBjYOaKjmO_KQ,1216
33
33
  datacontract/export/data_caterer_converter.py,sha256=eSEuy3TbqUIG_lHYEBOydAgp_CJNoGArXrcJvh81wcw,5984
34
34
  datacontract/export/dbml_converter.py,sha256=f_OZEFwRUyL-Kg2yn_G58I8iz1VfFrZh8Nbw3Wq0JDo,4777
35
- datacontract/export/dbt_converter.py,sha256=U2x7rtEnq1s3pHhM0L2B6D6OQtKdCdm4PBSqNCHczHk,10577
35
+ datacontract/export/dbt_converter.py,sha256=58bub8n22dfL8w6bKdFe28BLF0e4PHbrxO_H3rZ9wfk,11840
36
36
  datacontract/export/dcs_exporter.py,sha256=RALQ7bLAjak7EsoFFL2GFX2Oju7pnCDPCdRN_wo9wHM,210
37
+ datacontract/export/dqx_converter.py,sha256=5UevFPE8RdFIeu4CgeVnXMNDfWU7DhR34DW7O1aVIFs,4105
37
38
  datacontract/export/duckdb_type_converter.py,sha256=hUAAbImhJUMJOXEG-UoOKQqYGrJM6UILpn2YjUuAUOw,2216
38
- datacontract/export/excel_exporter.py,sha256=ySZL93oaENIjaLyctwoXOiT3yWf311YG3vYtLttjImI,38274
39
- datacontract/export/exporter.py,sha256=Xo4RyPq9W42hH3xfAX2v8FeQdMFoW0eVzgahY6JjlWI,3069
40
- datacontract/export/exporter_factory.py,sha256=JRrfcQ9CXiZCw56nFNu9uPSLjlDJLfUC7xPdVTyk6K8,6164
39
+ datacontract/export/excel_exporter.py,sha256=qn1GZBHYMmEIE9AWTwUskOQjmXtRcFapPO7XCTNcEMw,38344
40
+ datacontract/export/exporter.py,sha256=DfvMHDWmdqhJswLkQ5oMNojgYDblXDuRgFJRHuFSawM,3085
41
+ datacontract/export/exporter_factory.py,sha256=UvP3_U7xj-GEjaifi__Jri6eYKx9SFXtmSrnkSbWuP0,6318
41
42
  datacontract/export/go_converter.py,sha256=Ttvbfu3YU-3GBwRD6nwCsFyZuc_hiIvJD-Jg2sT5WLw,3331
42
43
  datacontract/export/great_expectations_converter.py,sha256=Wx0mESRy4xAf8y7HjESsGsQaaei8k9xOVu3RbC6BlQM,12257
43
44
  datacontract/export/html_exporter.py,sha256=EyTMj25_Df3irZiYw1hxVZeLYWp6YSG6z3IuFUviP14,3066
44
45
  datacontract/export/iceberg_converter.py,sha256=ArcQ_Y3z_W4_kGDU_8jPRx2-pHpP3Nhx1zYoETOL3c4,6804
45
46
  datacontract/export/jsonschema_converter.py,sha256=2MT82MurcQQbrVDRj1kFsxnmFd9scNSfYI1upQSecl4,5631
46
- datacontract/export/markdown_converter.py,sha256=sV74JBGEfvhteNYPwBR-78ucq0Avp9oaPdFpu3Ckd0w,9935
47
- datacontract/export/mermaid_exporter.py,sha256=wBFqRKgy3Y5FZnzD0RCR1UAlT9ZqYW7dkXWSJa6eHiQ,3465
47
+ datacontract/export/markdown_converter.py,sha256=J6QEGuopR9AUyEhux1GpjmJaQa1iihsbNMAmGRQ63BQ,10430
48
+ datacontract/export/mermaid_exporter.py,sha256=Hg2yc5DYDTEZ7etoIhB1LU6rob_sGlouDtkPxUtf6kQ,4008
48
49
  datacontract/export/odcs_v3_exporter.py,sha256=b__AiPAnCUuFQE5DPHsvXBrMeEl1t_mJ1vzTx84TMlI,13931
49
50
  datacontract/export/pandas_type_converter.py,sha256=464pQ3JQKFQa1TO0HBNcEoZvQye_yUbY6jQtiBaphSc,1117
50
51
  datacontract/export/protobuf_converter.py,sha256=DHLl8BW26xqltBsd7Qhz0RhTl9YZQKCbkmjNpECgubg,7928
51
52
  datacontract/export/pydantic_converter.py,sha256=1Lt9F8i6zyQYb44MyQtsXwCWWXYxZ47SmzArr_uPqsU,5579
52
- datacontract/export/rdf_converter.py,sha256=1aTe_fwBRBnYUrJZzhEQ8eVnl0mQ1hcF45aKVdgvSIc,6435
53
+ datacontract/export/rdf_converter.py,sha256=zY2BZrRxM0J6C2cgf5zA8c7FxDRImFjZUrJ4ksmvSTw,6435
53
54
  datacontract/export/sodacl_converter.py,sha256=75vQ2TnoLfjiDtWT2x8opumvotXVRs1YaIu1NLYz05M,1473
54
- datacontract/export/spark_converter.py,sha256=c4C_QZFRQLMW6Cz35WYdHqYGKyHSF7bBVmJua2YF0Cs,7290
55
+ datacontract/export/spark_converter.py,sha256=aol9ygEq29mjrZNiaK3Vdm8kEZhCgFFphuFiFDX-pOE,7953
55
56
  datacontract/export/sql_converter.py,sha256=vyLbDqzt_J3LRXpPv2W2HqUIyAtQx_S-jviBiSxh14A,5087
56
- datacontract/export/sql_type_converter.py,sha256=6-FKC4GTTSftXntIesiptQ51WVtS-mYgJpKrzhVDi1M,13694
57
+ datacontract/export/sql_type_converter.py,sha256=eWHRHJNeg6oOT2uUPjmcVjEf6H_qXZvDhvSCk-_iBAM,13890
57
58
  datacontract/export/sqlalchemy_converter.py,sha256=0DMncvA811lTtd5q4ZORREQ9YH1vQm1lJeqMWsFvloE,6463
58
59
  datacontract/export/terraform_converter.py,sha256=ExFoEvErVk-gBnWJiqC38SxDUmUEydpACWc917l5RyM,2163
59
60
  datacontract/imports/avro_importer.py,sha256=isfAnMq9bk-Yo5zSyTnqMegu7JIujn_sTGSTOYAc8-0,11847
@@ -69,26 +70,19 @@ datacontract/imports/importer_factory.py,sha256=RS7uwkkT7rIKGeMKgPmZhE3GVC9IfZxZ
69
70
  datacontract/imports/json_importer.py,sha256=JeGbqAC_wAO0u8HeMA5H-KJBfs6gpp1oGIpxt6nxSZI,12641
70
71
  datacontract/imports/jsonschema_importer.py,sha256=67H__XLugV4vguHrIqzW02dtx27zYTWnOms4D1ma3bk,4961
71
72
  datacontract/imports/odcs_importer.py,sha256=ZP2u3kJsgULANTbbqkP3joOlU9cUneZOPy6Ak3oTMgs,2140
72
- datacontract/imports/odcs_v3_importer.py,sha256=cDfAq5AdIS_DuHUhMWlAdTf3YLvc6fQhIElJyznRQBE,16924
73
+ datacontract/imports/odcs_v3_importer.py,sha256=ov1_PVoxZvzCd0a-cP5Ft2YJ_8vFDSxhqFqJBdMPLRY,20474
73
74
  datacontract/imports/parquet_importer.py,sha256=W_0_16mX4stwDUt4GM2L7dnGmTpAySab5k13-OlTCCc,3095
74
75
  datacontract/imports/protobuf_importer.py,sha256=rlUIskv9PNi5rFQ4Hobt9zlnKpahGsb4dy5G5UJoVAw,10840
75
76
  datacontract/imports/spark_importer.py,sha256=OxX9hJhi8e1o1pZGOKh5zWsK96SX13r0WV04kKDD61M,8964
76
77
  datacontract/imports/sql_importer.py,sha256=CfHap1zpyy-NVol_i21bDai3l4PD8OLuJQwaVlihbqg,9543
77
- datacontract/imports/unity_importer.py,sha256=iW4CJNbHNoQR5fqVlBJfdHnbbDasPgkwHHmyV9FKGkI,8687
78
- datacontract/init/init_template.py,sha256=nc-B2ZkwDQ3GNFqxNmSDcStQMDbBTxysgTZDLw15izo,721
78
+ datacontract/imports/unity_importer.py,sha256=F3pGI-cpkHmyqn83JK9tlxdgj0dfcex1g4zGP8_BhPg,9087
79
+ datacontract/init/init_template.py,sha256=sLCxvXHqoeW-Qes9W8GSVPfDmmu7pfnVOm-puI1-wsQ,721
79
80
  datacontract/integration/datamesh_manager.py,sha256=FT9eadzFz181lg54b49_c_x2caGJT7mR3drlZBSBJLo,3375
80
81
  datacontract/lint/files.py,sha256=tg0vq_w4LQsEr_8A5qr4hUJmHeGalUpsXJXC1t-OGC0,471
81
- datacontract/lint/lint.py,sha256=Ew0n3ooXxmCVnUxJ_cDoacsD82QdMZYnKrxnG9J0sWQ,5077
82
- datacontract/lint/resolve.py,sha256=cXYAEfmy1mhK-RwnAOOQ7PzsDI0iRdKjQHDWHozq5DY,14507
82
+ datacontract/lint/resolve.py,sha256=wDD6NRT1d_6Kh_CRKRwPO_q10VrnlKECWCYgyxsI1Ks,14507
83
83
  datacontract/lint/resources.py,sha256=nfeZmORh1aP7EKpMKCmfbS04Te8pQ0nz64vJVkHOq3c,647
84
- datacontract/lint/schema.py,sha256=xRHPu6K-kepw1jSnUXY-s5IikjIrH7fvDtsGqQeupYw,1813
84
+ datacontract/lint/schema.py,sha256=GtjyWJvG_Q1O0kHkXSRaIzQh7a9kdZ64u-hKkbZpm8A,1813
85
85
  datacontract/lint/urls.py,sha256=giac0eAYa6hha8exleL3KsiPtiFlOq8l53axtAmCilw,2529
86
- datacontract/lint/linters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
87
- datacontract/lint/linters/description_linter.py,sha256=kQi38TKhqiEL3fwQDs6SdQQ9hXBHgfAi6Q6ZFNuLw1o,1505
88
- datacontract/lint/linters/field_pattern_linter.py,sha256=lreGvOW3v_Glah_SriVe9ejZ7EuR6_gJsdr2tEORB_8,1084
89
- datacontract/lint/linters/field_reference_linter.py,sha256=klLsQleJwW2qSJT0haS_V63oo7uYt2-SXbJh-rRkfVI,1989
90
- datacontract/lint/linters/notice_period_linter.py,sha256=_0ZrwlHWA8my0IWAY3upQNKfeigj5N0ulT7Me9kd2PE,2124
91
- datacontract/lint/linters/valid_constraints_linter.py,sha256=-IUyFFoEbnoNbjjJntlJv1POajh2mRU-4mJQVPL5r9s,4904
92
86
  datacontract/model/exceptions.py,sha256=5BMuEH2qWuckNP4FTfpUEeEu6rjgGcLOD0GQugKRQ1U,1242
93
87
  datacontract/model/odcs.py,sha256=9PXwm72FASjNwteF1Jn591iP3-St0aq16Cpsk0PkEW8,389
94
88
  datacontract/model/run.py,sha256=4UdEUaJl5RxEpN9S3swSu1vGJUVyNhOpRkdfbBZhh90,3146
@@ -97,13 +91,16 @@ datacontract/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
97
91
  datacontract/output/junit_test_results.py,sha256=ZjevRMTxNSiR0HMr3bEvqv4olozPw2zEutbuLloInww,4822
98
92
  datacontract/output/output_format.py,sha256=_ZokDBo7-HXBs6czUv7kLLf9cYft_q5QaKzthsVnc58,212
99
93
  datacontract/output/test_results_writer.py,sha256=PWNLs3R_LQMH4xp5WDxLkQgY3xvj8Eyzw1jnfgkQxlc,2713
100
- datacontract/schemas/datacontract-1.1.0.init.yaml,sha256=RXRqtMiRsm1oqxXrKAzqQ_eScIr9D8td8-NWWmpYvM0,1828
94
+ datacontract/schemas/datacontract-1.1.0.init.yaml,sha256=ij_-ZEJP4A7ekeJfoqGpRbiCys7_YjkClNluVVo4C6E,1828
101
95
  datacontract/schemas/datacontract-1.1.0.schema.json,sha256=3Bu2rxEjkF6dNLcqi1GF4KoXBnEIopaJ87Qb8S4zUvg,62872
102
- datacontract/schemas/datacontract-1.2.0.init.yaml,sha256=RXRqtMiRsm1oqxXrKAzqQ_eScIr9D8td8-NWWmpYvM0,1828
96
+ datacontract/schemas/datacontract-1.2.0.init.yaml,sha256=ij_-ZEJP4A7ekeJfoqGpRbiCys7_YjkClNluVVo4C6E,1828
103
97
  datacontract/schemas/datacontract-1.2.0.schema.json,sha256=sk7oL06cug9-WozCrLH8v8MuR3a8MaV1Ztkm1P-7UFk,64226
98
+ datacontract/schemas/datacontract-1.2.1.init.yaml,sha256=ij_-ZEJP4A7ekeJfoqGpRbiCys7_YjkClNluVVo4C6E,1828
99
+ datacontract/schemas/datacontract-1.2.1.schema.json,sha256=Ha6F8i2jaL3BKOV5kjWgaxzykAiaSLqjIq-OEOojnx4,65233
104
100
  datacontract/schemas/odcs-3.0.1.schema.json,sha256=bRZsSXA0fV0EmV_8f1K68PlXu1m4K7JcuHpLnY3ESwQ,72933
101
+ datacontract/schemas/odcs-3.0.2.schema.json,sha256=_J13Tqc9E7RzpSho645meE86AxeU0dIt2U12-MnAfHk,69968
105
102
  datacontract/templates/datacontract.html,sha256=dksPEnY3c66jaaVS5r5vWfG6LzyXPjA4nO_yLUirJWg,17394
106
- datacontract/templates/datacontract_odcs.html,sha256=-k6v_ddMkQ6HPbj0_c6SmP3LfesRVsjvSVt4EpOfzpg,32849
103
+ datacontract/templates/datacontract_odcs.html,sha256=u4bpcgQVqwGmR0QjijJqecOClV2ZhpDvnNMAMzj4Ezc,32659
107
104
  datacontract/templates/index.html,sha256=8AAJbizpW6UxQBnHjW4Ft7L7nTn7XJtV43gVBwQxFxA,12711
108
105
  datacontract/templates/partials/datacontract_information.html,sha256=7ZBxgEgi2XndKBypeOpe03oCSRPOujC6NVlN7zexGNM,6221
109
106
  datacontract/templates/partials/datacontract_servicelevels.html,sha256=ed3QgB11B0Qq2h_NwaroGZ4pQMBPEhfeQaoS-qEipqY,11401
@@ -114,9 +111,9 @@ datacontract/templates/partials/model_field.html,sha256=2YBF95ypNCPFYuYKoeilRnDG
114
111
  datacontract/templates/partials/quality.html,sha256=ynEDWRn8I90Uje-xhGYgFcfwOgKI1R-CDki-EvTsauQ,1785
115
112
  datacontract/templates/partials/server.html,sha256=dHFJtonMjhiUHtT69RUgTpkoRwmNdTRzkCdH0LtGg_4,6279
116
113
  datacontract/templates/style/output.css,sha256=ioIo1f96VW7LHhDifj6QI8QbRChJl-LlQ59EwM8MEmA,28692
117
- datacontract_cli-0.10.34.dist-info/licenses/LICENSE,sha256=0hcS8X51AL0UvEsx1ZM6WQcxiy9d0j5iOfzdPYM6ONU,2205
118
- datacontract_cli-0.10.34.dist-info/METADATA,sha256=vMywE_iShiMd1OEND9UggCJ_s9swhY7Ls_6eaMgvC-k,114165
119
- datacontract_cli-0.10.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
120
- datacontract_cli-0.10.34.dist-info/entry_points.txt,sha256=D3Eqy4q_Z6bHauGd4ppIyQglwbrm1AJnLau4Ppbw9Is,54
121
- datacontract_cli-0.10.34.dist-info/top_level.txt,sha256=VIRjd8EIUrBYWjEXJJjtdUgc0UAJdPZjmLiOR8BRBYM,13
122
- datacontract_cli-0.10.34.dist-info/RECORD,,
114
+ datacontract_cli-0.10.36.dist-info/licenses/LICENSE,sha256=0hcS8X51AL0UvEsx1ZM6WQcxiy9d0j5iOfzdPYM6ONU,2205
115
+ datacontract_cli-0.10.36.dist-info/METADATA,sha256=zk34Wgf2d8yAbM2bV4jw_ssSqyO9RGdMWTSSLMNH1vQ,114670
116
+ datacontract_cli-0.10.36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
117
+ datacontract_cli-0.10.36.dist-info/entry_points.txt,sha256=D3Eqy4q_Z6bHauGd4ppIyQglwbrm1AJnLau4Ppbw9Is,54
118
+ datacontract_cli-0.10.36.dist-info/top_level.txt,sha256=VIRjd8EIUrBYWjEXJJjtdUgc0UAJdPZjmLiOR8BRBYM,13
119
+ datacontract_cli-0.10.36.dist-info/RECORD,,