datacontract-cli 0.10.24__py3-none-any.whl → 0.10.26__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.
- datacontract/api.py +3 -3
- datacontract/cli.py +1 -1
- datacontract/engines/soda/connections/kafka.py +2 -1
- datacontract/export/great_expectations_converter.py +49 -2
- datacontract/export/odcs_v3_exporter.py +183 -140
- datacontract/export/spark_converter.py +1 -1
- datacontract/export/sql_converter.py +4 -0
- datacontract/export/sql_type_converter.py +2 -0
- datacontract/imports/avro_importer.py +23 -23
- datacontract/imports/csv_importer.py +2 -2
- datacontract/imports/excel_importer.py +850 -0
- datacontract/imports/importer.py +4 -2
- datacontract/imports/importer_factory.py +5 -0
- datacontract/imports/odcs_v3_importer.py +202 -145
- datacontract/imports/protobuf_importer.py +0 -2
- datacontract/imports/spark_importer.py +2 -0
- datacontract/lint/linters/description_linter.py +1 -3
- datacontract/lint/linters/field_reference_linter.py +1 -2
- datacontract/lint/linters/notice_period_linter.py +2 -2
- datacontract/lint/linters/valid_constraints_linter.py +3 -3
- datacontract/model/data_contract_specification/__init__.py +1 -0
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/METADATA +59 -18
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/RECORD +27 -26
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/WHEEL +1 -1
- datacontract/model/data_contract_specification.py +0 -327
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/entry_points.txt +0 -0
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/licenses/LICENSE +0 -0
- {datacontract_cli-0.10.24.dist-info → datacontract_cli-0.10.26.dist-info}/top_level.txt +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: datacontract-cli
|
|
3
|
-
Version: 0.10.
|
|
3
|
+
Version: 0.10.26
|
|
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
|
+
License-Expression: MIT
|
|
6
7
|
Project-URL: Homepage, https://cli.datacontract.com
|
|
7
8
|
Project-URL: Issues, https://github.com/datacontract/datacontract-cli/issues
|
|
8
9
|
Classifier: Programming Language :: Python :: 3
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
10
|
Classifier: Operating System :: OS Independent
|
|
11
11
|
Requires-Python: >=3.10
|
|
12
12
|
Description-Content-Type: text/markdown
|
|
@@ -28,17 +28,21 @@ 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.1.1
|
|
32
|
+
Requires-Dist: open-data-contract-standard<4.0.0,>=3.0.4
|
|
31
33
|
Provides-Extra: avro
|
|
32
34
|
Requires-Dist: avro==1.12.0; extra == "avro"
|
|
33
35
|
Provides-Extra: bigquery
|
|
34
36
|
Requires-Dist: soda-core-bigquery<3.6.0,>=3.3.20; extra == "bigquery"
|
|
35
37
|
Provides-Extra: csv
|
|
36
38
|
Requires-Dist: pandas>=2.0.0; extra == "csv"
|
|
39
|
+
Provides-Extra: excel
|
|
40
|
+
Requires-Dist: openpyxl<4.0.0,>=3.1.5; extra == "excel"
|
|
37
41
|
Provides-Extra: databricks
|
|
38
42
|
Requires-Dist: soda-core-spark-df<3.6.0,>=3.3.20; extra == "databricks"
|
|
39
43
|
Requires-Dist: soda-core-spark[databricks]<3.6.0,>=3.3.20; extra == "databricks"
|
|
40
44
|
Requires-Dist: databricks-sql-connector<4.1.0,>=3.7.0; extra == "databricks"
|
|
41
|
-
Requires-Dist: databricks-sdk<0.
|
|
45
|
+
Requires-Dist: databricks-sdk<0.51.0; extra == "databricks"
|
|
42
46
|
Provides-Extra: iceberg
|
|
43
47
|
Requires-Dist: pyiceberg==0.8.1; extra == "iceberg"
|
|
44
48
|
Provides-Extra: kafka
|
|
@@ -66,11 +70,11 @@ Provides-Extra: rdf
|
|
|
66
70
|
Requires-Dist: rdflib==7.0.0; extra == "rdf"
|
|
67
71
|
Provides-Extra: api
|
|
68
72
|
Requires-Dist: fastapi==0.115.12; extra == "api"
|
|
69
|
-
Requires-Dist: uvicorn==0.34.
|
|
73
|
+
Requires-Dist: uvicorn==0.34.2; extra == "api"
|
|
70
74
|
Provides-Extra: protobuf
|
|
71
75
|
Requires-Dist: grpcio-tools>=1.53; extra == "protobuf"
|
|
72
76
|
Provides-Extra: all
|
|
73
|
-
Requires-Dist: datacontract-cli[api,bigquery,csv,databricks,dbml,dbt,iceberg,kafka,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
|
|
77
|
+
Requires-Dist: datacontract-cli[api,bigquery,csv,databricks,dbml,dbt,excel,iceberg,kafka,parquet,postgres,protobuf,rdf,s3,snowflake,sqlserver,trino]; extra == "all"
|
|
74
78
|
Provides-Extra: dev
|
|
75
79
|
Requires-Dist: datacontract-cli[all]; extra == "dev"
|
|
76
80
|
Requires-Dist: httpx==0.28.1; extra == "dev"
|
|
@@ -80,7 +84,7 @@ Requires-Dist: pandas>=2.1.0; extra == "dev"
|
|
|
80
84
|
Requires-Dist: pre-commit<4.3.0,>=3.7.1; extra == "dev"
|
|
81
85
|
Requires-Dist: pytest; extra == "dev"
|
|
82
86
|
Requires-Dist: pytest-xdist; extra == "dev"
|
|
83
|
-
Requires-Dist: pymssql==2.3.
|
|
87
|
+
Requires-Dist: pymssql==2.3.4; extra == "dev"
|
|
84
88
|
Requires-Dist: ruff; extra == "dev"
|
|
85
89
|
Requires-Dist: testcontainers[kafka,minio,mssql,postgres]==4.9.2; extra == "dev"
|
|
86
90
|
Requires-Dist: trino==0.333.0; extra == "dev"
|
|
@@ -900,6 +904,29 @@ models:
|
|
|
900
904
|
| `DATACONTRACT_TRINO_PASSWORD` | `mysecretpassword` | Password |
|
|
901
905
|
|
|
902
906
|
|
|
907
|
+
#### Local
|
|
908
|
+
|
|
909
|
+
Data Contract CLI can test local files in parquet, json, csv, or delta format.
|
|
910
|
+
|
|
911
|
+
##### Example
|
|
912
|
+
|
|
913
|
+
datacontract.yaml
|
|
914
|
+
```yaml
|
|
915
|
+
servers:
|
|
916
|
+
local:
|
|
917
|
+
type: local
|
|
918
|
+
path: ./*.parquet
|
|
919
|
+
format: parquet
|
|
920
|
+
models:
|
|
921
|
+
my_table_1: # corresponds to a table
|
|
922
|
+
type: table
|
|
923
|
+
fields:
|
|
924
|
+
my_column_1: # corresponds to a column
|
|
925
|
+
type: varchar
|
|
926
|
+
my_column_2: # corresponds to a column
|
|
927
|
+
type: string
|
|
928
|
+
```
|
|
929
|
+
|
|
903
930
|
|
|
904
931
|
### export
|
|
905
932
|
```
|
|
@@ -1370,20 +1397,21 @@ Available import options:
|
|
|
1370
1397
|
|
|
1371
1398
|
| Type | Description | Status |
|
|
1372
1399
|
|--------------------|------------------------------------------------|--------|
|
|
1373
|
-
| `sql` | Import from SQL DDL | ✅ |
|
|
1374
1400
|
| `avro` | Import from AVRO schemas | ✅ |
|
|
1375
|
-
| `glue` | Import from AWS Glue DataCatalog | ✅ |
|
|
1376
|
-
| `jsonschema` | Import from JSON Schemas | ✅ |
|
|
1377
1401
|
| `bigquery` | Import from BigQuery Schemas | ✅ |
|
|
1378
|
-
| `
|
|
1402
|
+
| `csv` | Import from CSV File | ✅ |
|
|
1403
|
+
| `dbml` | Import from DBML models | ✅ |
|
|
1379
1404
|
| `dbt` | Import from dbt models | ✅ |
|
|
1405
|
+
| `excel` | Import from ODCS Excel Template | ✅ |
|
|
1406
|
+
| `glue` | Import from AWS Glue DataCatalog | ✅ |
|
|
1407
|
+
| `iceberg` | Import from an Iceberg JSON Schema Definition | partial |
|
|
1408
|
+
| `jsonschema` | Import from JSON Schemas | ✅ |
|
|
1380
1409
|
| `odcs` | Import from Open Data Contract Standard (ODCS) | ✅ |
|
|
1381
|
-
| `
|
|
1382
|
-
| `dbml` | Import from DBML models | ✅ |
|
|
1383
|
-
| `csv` | Import from CSV File | ✅ |
|
|
1410
|
+
| `parquet` | Import from Parquet File Metadata | ✅ |
|
|
1384
1411
|
| `protobuf` | Import from Protobuf schemas | ✅ |
|
|
1385
|
-
| `
|
|
1386
|
-
| `
|
|
1412
|
+
| `spark` | Import from Spark StructTypes | ✅ |
|
|
1413
|
+
| `sql` | Import from SQL DDL | ✅ |
|
|
1414
|
+
| `unity` | Import from Databricks Unity Catalog | partial |
|
|
1387
1415
|
| Missing something? | Please create an issue on GitHub | TBD |
|
|
1388
1416
|
|
|
1389
1417
|
|
|
@@ -1433,8 +1461,9 @@ datacontract import --format unity --source my_unity_table.json
|
|
|
1433
1461
|
|
|
1434
1462
|
```bash
|
|
1435
1463
|
# Example import single table from Unity Catalog via HTTP endpoint
|
|
1436
|
-
export
|
|
1437
|
-
export
|
|
1464
|
+
export DATACONTRACT_DATABRICKS_SERVER_HOSTNAME="https://xyz.cloud.databricks.com"
|
|
1465
|
+
export DATACONTRACT_DATABRICKS_HTTP_PATH="/sql/1.0/warehouses/b053a331fa014fb4"
|
|
1466
|
+
export DATACONTRACT_DATABRICKS_TOKEN=<token>
|
|
1438
1467
|
datacontract import --format unity --unity-table-full-name <table_full_name>
|
|
1439
1468
|
```
|
|
1440
1469
|
|
|
@@ -1455,6 +1484,17 @@ datacontract import --format dbt --source <manifest_path> --dbt-model <model_nam
|
|
|
1455
1484
|
datacontract import --format dbt --source <manifest_path>
|
|
1456
1485
|
```
|
|
1457
1486
|
|
|
1487
|
+
### Excel
|
|
1488
|
+
|
|
1489
|
+
Importing from [ODCS Excel Template](https://github.com/datacontract/open-data-contract-standard-excel-template).
|
|
1490
|
+
|
|
1491
|
+
Examples:
|
|
1492
|
+
|
|
1493
|
+
```bash
|
|
1494
|
+
# Example import from ODCS Excel Template
|
|
1495
|
+
datacontract import --format excel --source odcs.xlsx
|
|
1496
|
+
```
|
|
1497
|
+
|
|
1458
1498
|
#### Glue
|
|
1459
1499
|
|
|
1460
1500
|
Importing from Glue reads the necessary Data directly off of the AWS API.
|
|
@@ -1994,7 +2034,8 @@ pytest
|
|
|
1994
2034
|
```bash
|
|
1995
2035
|
# make sure uv is installed
|
|
1996
2036
|
uv python pin 3.11
|
|
1997
|
-
uv
|
|
2037
|
+
uv pip install -e '.[dev]'
|
|
2038
|
+
uv run ruff check
|
|
1998
2039
|
uv run pytest
|
|
1999
2040
|
```
|
|
2000
2041
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
datacontract/__init__.py,sha256=ThDdxDJsd7qNErLoh628nK5M7RzhJNYCmN-C6BAJFoo,405
|
|
2
|
-
datacontract/api.py,sha256=
|
|
3
|
-
datacontract/cli.py,sha256=
|
|
2
|
+
datacontract/api.py,sha256=031PVQbZGHPVpFLFHGQ-Igc5queVCnjAun6oxLDMIOo,8175
|
|
3
|
+
datacontract/cli.py,sha256=32f-hsUVUp_ArNbRB4uCr0dE-fxB5qpjB31lu_AbbmU,16863
|
|
4
4
|
datacontract/data_contract.py,sha256=unt7wnThY4qMtexdCc4fYU0gCEwdhDdYjHn_u_Ya6_Q,10740
|
|
5
5
|
datacontract/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
6
|
datacontract/breaking/breaking.py,sha256=DnqgxUjD-EAZcg5RBizOP9a2WxsFTaQBik0AB_m3K00,20431
|
|
@@ -19,7 +19,7 @@ datacontract/engines/soda/check_soda_execute.py,sha256=SYJdPpkozOA62yTM7s6cfwLfg
|
|
|
19
19
|
datacontract/engines/soda/connections/bigquery.py,sha256=C-8kxmzpYe88bJp80ObHFLMh4rpnIjnUQ7XOj0Ke7lk,903
|
|
20
20
|
datacontract/engines/soda/connections/databricks.py,sha256=cMRasuO0MrSKVgHPB-9uFTGTZPFg6z9Kpk3tJ0SdR0s,943
|
|
21
21
|
datacontract/engines/soda/connections/duckdb_connection.py,sha256=hy2HxktSSt1tFB7rVI7tDOe6WeTNvHSKqsEk9uIkntU,9114
|
|
22
|
-
datacontract/engines/soda/connections/kafka.py,sha256=
|
|
22
|
+
datacontract/engines/soda/connections/kafka.py,sha256=lnj_-3-CnJ6stetGqm6HOzN1Qatlw7xoCQU2zKBIXxU,8725
|
|
23
23
|
datacontract/engines/soda/connections/postgres.py,sha256=9GTF4Es3M5vb7ocSGqAxXmslvkS5CjsPQGIuo020CFc,626
|
|
24
24
|
datacontract/engines/soda/connections/snowflake.py,sha256=rfG2ysuqNM6TkvyqQKcGHFsTGJ6AROmud5VleUDRrb0,749
|
|
25
25
|
datacontract/engines/soda/connections/sqlserver.py,sha256=RzGLbCUdRyfmDcqtM_AB9WZ-Xk-XYX91nkXpVNpYbvc,1440
|
|
@@ -37,37 +37,38 @@ datacontract/export/duckdb_type_converter.py,sha256=hUAAbImhJUMJOXEG-UoOKQqYGrJM
|
|
|
37
37
|
datacontract/export/exporter.py,sha256=XrNmoIH_5Myb8jx-vaS1ZCF11RTw5zf5JATkqXWunXE,3025
|
|
38
38
|
datacontract/export/exporter_factory.py,sha256=0XmU51fQNZVQdC78gDy_82CatazhioMmcd6qdCl8muU,5847
|
|
39
39
|
datacontract/export/go_converter.py,sha256=Ttvbfu3YU-3GBwRD6nwCsFyZuc_hiIvJD-Jg2sT5WLw,3331
|
|
40
|
-
datacontract/export/great_expectations_converter.py,sha256=
|
|
40
|
+
datacontract/export/great_expectations_converter.py,sha256=WvEa4HNUMyzn2a5YNkcI9mjROzGkKRYOS2gFPjRRHNc,12218
|
|
41
41
|
datacontract/export/html_export.py,sha256=ojazWrb0AwSc7Vr72M_otMo-3PA8mfi8tfIy9BCXk9o,2578
|
|
42
42
|
datacontract/export/iceberg_converter.py,sha256=ArcQ_Y3z_W4_kGDU_8jPRx2-pHpP3Nhx1zYoETOL3c4,6804
|
|
43
43
|
datacontract/export/jsonschema_converter.py,sha256=2MT82MurcQQbrVDRj1kFsxnmFd9scNSfYI1upQSecl4,5631
|
|
44
44
|
datacontract/export/markdown_converter.py,sha256=chtaZX4vXTee7JCMYmWiDQ9m55gwJjHPw6SEM3UOwpQ,6467
|
|
45
|
-
datacontract/export/odcs_v3_exporter.py,sha256
|
|
45
|
+
datacontract/export/odcs_v3_exporter.py,sha256=ta5NMqZ-9k-w9okdkYrPbMtd4b0ldHGL0_w70EdA5ho,13769
|
|
46
46
|
datacontract/export/pandas_type_converter.py,sha256=464pQ3JQKFQa1TO0HBNcEoZvQye_yUbY6jQtiBaphSc,1117
|
|
47
47
|
datacontract/export/protobuf_converter.py,sha256=DHLl8BW26xqltBsd7Qhz0RhTl9YZQKCbkmjNpECgubg,7928
|
|
48
48
|
datacontract/export/pydantic_converter.py,sha256=1Lt9F8i6zyQYb44MyQtsXwCWWXYxZ47SmzArr_uPqsU,5579
|
|
49
49
|
datacontract/export/rdf_converter.py,sha256=4gnKus37Geth4MJ3Ruc8AbnpD_Ll9OCx8oTIEKScvh8,6435
|
|
50
50
|
datacontract/export/sodacl_converter.py,sha256=lQCOcNiT7i6KGaJ1Ua4MYBYGm-EyktTGrL4FLZDi14c,1102
|
|
51
|
-
datacontract/export/spark_converter.py,sha256
|
|
52
|
-
datacontract/export/sql_converter.py,sha256=
|
|
53
|
-
datacontract/export/sql_type_converter.py,sha256
|
|
51
|
+
datacontract/export/spark_converter.py,sha256=LCue-rLan3ki7HgzUFyBaO8YUlc6CrDNBZD-QVgUv-U,7190
|
|
52
|
+
datacontract/export/sql_converter.py,sha256=KA5PNmKxUWF_8QXRX8aGvMGf7pX0rZgkLe6mbK8Q7Qk,5089
|
|
53
|
+
datacontract/export/sql_type_converter.py,sha256=-ZHDihXWd5Gr9XG5FyE5-NLfB5q-HTdjx6P6TdsckDA,13497
|
|
54
54
|
datacontract/export/sqlalchemy_converter.py,sha256=0DMncvA811lTtd5q4ZORREQ9YH1vQm1lJeqMWsFvloE,6463
|
|
55
55
|
datacontract/export/terraform_converter.py,sha256=ExFoEvErVk-gBnWJiqC38SxDUmUEydpACWc917l5RyM,2163
|
|
56
|
-
datacontract/imports/avro_importer.py,sha256=
|
|
56
|
+
datacontract/imports/avro_importer.py,sha256=ryu4iUCSPJEV1uaE3AKdxD7fUxmRJ-ta936xurbgtHc,10922
|
|
57
57
|
datacontract/imports/bigquery_importer.py,sha256=7TcP9FDsIas5LwJZ-HrOPXZ-NuR056sxLfDDh3vjo8E,8419
|
|
58
|
-
datacontract/imports/csv_importer.py,sha256=
|
|
58
|
+
datacontract/imports/csv_importer.py,sha256=mBsmyTvfB8q64Z3NYqv4zTDUOvoXG896hZvp3oLt5YM,5330
|
|
59
59
|
datacontract/imports/dbml_importer.py,sha256=o0IOgvXN34lU1FICDHm_QUTv0DKsgwbHPHUDxQhIapE,3872
|
|
60
60
|
datacontract/imports/dbt_importer.py,sha256=hQwqD9vbvwLLc6Yj3tQbar5ldI0pV-ynSiz7CZZ0JCc,8290
|
|
61
|
+
datacontract/imports/excel_importer.py,sha256=gBKBKYImkv-bpmJu7JChnGqh8Yie3WIlxvjqgq8wNSc,36951
|
|
61
62
|
datacontract/imports/glue_importer.py,sha256=fiJPkvfwOCsaKKCGW19-JM5CCGXZ2mkNrVtUzp2iw6g,8370
|
|
62
63
|
datacontract/imports/iceberg_importer.py,sha256=vadGJVqQKgG-j8swUytZALFB8QjbGRqZPCcPcCy0vco,5923
|
|
63
|
-
datacontract/imports/importer.py,sha256=
|
|
64
|
-
datacontract/imports/importer_factory.py,sha256=
|
|
64
|
+
datacontract/imports/importer.py,sha256=u9HJHQ_PQKW9MoIsfRxzs-qQ33JZbeo2EjZiB71O63c,1006
|
|
65
|
+
datacontract/imports/importer_factory.py,sha256=VBSrr9e3g09eJwnkZveJXuUMrQr072AcTJZ0q1MVf18,3966
|
|
65
66
|
datacontract/imports/jsonschema_importer.py,sha256=67H__XLugV4vguHrIqzW02dtx27zYTWnOms4D1ma3bk,4961
|
|
66
67
|
datacontract/imports/odcs_importer.py,sha256=vv2dHLGL0Cdivv1CdKn5euJwGNKmiZmXCoxUYAXsHX8,2126
|
|
67
|
-
datacontract/imports/odcs_v3_importer.py,sha256=
|
|
68
|
+
datacontract/imports/odcs_v3_importer.py,sha256=sZVBENcPMl6rt0bbT_b1lnTFs3KOe1cZ2hwWaJBQhgY,16924
|
|
68
69
|
datacontract/imports/parquet_importer.py,sha256=W_0_16mX4stwDUt4GM2L7dnGmTpAySab5k13-OlTCCc,3095
|
|
69
|
-
datacontract/imports/protobuf_importer.py,sha256=
|
|
70
|
-
datacontract/imports/spark_importer.py,sha256=
|
|
70
|
+
datacontract/imports/protobuf_importer.py,sha256=rlUIskv9PNi5rFQ4Hobt9zlnKpahGsb4dy5G5UJoVAw,10840
|
|
71
|
+
datacontract/imports/spark_importer.py,sha256=8sPI6tcH0aMlaUYdc2P_abrJfOBp7vWFgvYE5jRNwLU,5177
|
|
71
72
|
datacontract/imports/sql_importer.py,sha256=ElFS2LILDOvWzW-X4emSIKltFV42i78TEoyg0bvn3II,9322
|
|
72
73
|
datacontract/imports/unity_importer.py,sha256=UcPYABhLZaWNl5IkCazwAuMoVDdujsu_QteuV_Q9hgI,6737
|
|
73
74
|
datacontract/init/init_template.py,sha256=BMawR-AF_vXyn_-Co-XoT8Dxj9b55V8xKk2KkJK-c1o,721
|
|
@@ -79,15 +80,15 @@ datacontract/lint/resources.py,sha256=nfeZmORh1aP7EKpMKCmfbS04Te8pQ0nz64vJVkHOq3
|
|
|
79
80
|
datacontract/lint/schema.py,sha256=4pYX6JX6SkASftyqaWTodKFRVPi2qV0_Z60tvaCOk80,1813
|
|
80
81
|
datacontract/lint/urls.py,sha256=giac0eAYa6hha8exleL3KsiPtiFlOq8l53axtAmCilw,2529
|
|
81
82
|
datacontract/lint/linters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
82
|
-
datacontract/lint/linters/description_linter.py,sha256=
|
|
83
|
+
datacontract/lint/linters/description_linter.py,sha256=kQi38TKhqiEL3fwQDs6SdQQ9hXBHgfAi6Q6ZFNuLw1o,1505
|
|
83
84
|
datacontract/lint/linters/field_pattern_linter.py,sha256=lreGvOW3v_Glah_SriVe9ejZ7EuR6_gJsdr2tEORB_8,1084
|
|
84
|
-
datacontract/lint/linters/field_reference_linter.py,sha256=
|
|
85
|
-
datacontract/lint/linters/notice_period_linter.py,sha256=
|
|
86
|
-
datacontract/lint/linters/valid_constraints_linter.py,sha256
|
|
87
|
-
datacontract/model/data_contract_specification.py,sha256=5-59qU0BD1mM4D7LuUGuJeUFSG9vkICEVYI9bA2wsI4,8673
|
|
85
|
+
datacontract/lint/linters/field_reference_linter.py,sha256=klLsQleJwW2qSJT0haS_V63oo7uYt2-SXbJh-rRkfVI,1989
|
|
86
|
+
datacontract/lint/linters/notice_period_linter.py,sha256=_0ZrwlHWA8my0IWAY3upQNKfeigj5N0ulT7Me9kd2PE,2124
|
|
87
|
+
datacontract/lint/linters/valid_constraints_linter.py,sha256=-IUyFFoEbnoNbjjJntlJv1POajh2mRU-4mJQVPL5r9s,4904
|
|
88
88
|
datacontract/model/exceptions.py,sha256=5BMuEH2qWuckNP4FTfpUEeEu6rjgGcLOD0GQugKRQ1U,1242
|
|
89
89
|
datacontract/model/odcs.py,sha256=9PXwm72FASjNwteF1Jn591iP3-St0aq16Cpsk0PkEW8,389
|
|
90
90
|
datacontract/model/run.py,sha256=4UdEUaJl5RxEpN9S3swSu1vGJUVyNhOpRkdfbBZhh90,3146
|
|
91
|
+
datacontract/model/data_contract_specification/__init__.py,sha256=lO7ywraknlDwJNUaSd2B9FWFsWhE8v5S-kob_shW_lg,47
|
|
91
92
|
datacontract/output/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
92
93
|
datacontract/output/junit_test_results.py,sha256=hAT7UgxwbfNzA0f5uuGzM4OIwLfXbmA4dgsfxsclWh0,4822
|
|
93
94
|
datacontract/output/output_format.py,sha256=_ZokDBo7-HXBs6czUv7kLLf9cYft_q5QaKzthsVnc58,212
|
|
@@ -106,9 +107,9 @@ datacontract/templates/partials/model_field.html,sha256=2YBF95ypNCPFYuYKoeilRnDG
|
|
|
106
107
|
datacontract/templates/partials/quality.html,sha256=ynEDWRn8I90Uje-xhGYgFcfwOgKI1R-CDki-EvTsauQ,1785
|
|
107
108
|
datacontract/templates/partials/server.html,sha256=WkWFbz1ZvhIAUQQhH5Lkwb0HZRW907ehEnFmJSkpquQ,6235
|
|
108
109
|
datacontract/templates/style/output.css,sha256=V1k6smSvlz07W2UNOkhcDFUb0HLmoas7DnNg_o8XUcA,25759
|
|
109
|
-
datacontract_cli-0.10.
|
|
110
|
-
datacontract_cli-0.10.
|
|
111
|
-
datacontract_cli-0.10.
|
|
112
|
-
datacontract_cli-0.10.
|
|
113
|
-
datacontract_cli-0.10.
|
|
114
|
-
datacontract_cli-0.10.
|
|
110
|
+
datacontract_cli-0.10.26.dist-info/licenses/LICENSE,sha256=23h64qnSeIZ0DKeziWAKC-zBCt328iSbRbWBrXoYRb4,2210
|
|
111
|
+
datacontract_cli-0.10.26.dist-info/METADATA,sha256=wK_1AwnrBPOBTCRKORH63413TPMUkiVJGBSEs6GmQtQ,104876
|
|
112
|
+
datacontract_cli-0.10.26.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
|
113
|
+
datacontract_cli-0.10.26.dist-info/entry_points.txt,sha256=D3Eqy4q_Z6bHauGd4ppIyQglwbrm1AJnLau4Ppbw9Is,54
|
|
114
|
+
datacontract_cli-0.10.26.dist-info/top_level.txt,sha256=VIRjd8EIUrBYWjEXJJjtdUgc0UAJdPZjmLiOR8BRBYM,13
|
|
115
|
+
datacontract_cli-0.10.26.dist-info/RECORD,,
|
|
@@ -1,327 +0,0 @@
|
|
|
1
|
-
import os
|
|
2
|
-
from typing import Any, Dict, List
|
|
3
|
-
|
|
4
|
-
import pydantic as pyd
|
|
5
|
-
import yaml
|
|
6
|
-
|
|
7
|
-
DATACONTRACT_TYPES = [
|
|
8
|
-
"string",
|
|
9
|
-
"text",
|
|
10
|
-
"varchar",
|
|
11
|
-
"number",
|
|
12
|
-
"decimal",
|
|
13
|
-
"numeric",
|
|
14
|
-
"int",
|
|
15
|
-
"integer",
|
|
16
|
-
"long",
|
|
17
|
-
"bigint",
|
|
18
|
-
"float",
|
|
19
|
-
"double",
|
|
20
|
-
"boolean",
|
|
21
|
-
"timestamp",
|
|
22
|
-
"timestamp_tz",
|
|
23
|
-
"timestamp_ntz",
|
|
24
|
-
"date",
|
|
25
|
-
"array",
|
|
26
|
-
"bytes",
|
|
27
|
-
"object",
|
|
28
|
-
"record",
|
|
29
|
-
"struct",
|
|
30
|
-
"null",
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class Contact(pyd.BaseModel):
|
|
35
|
-
name: str | None = None
|
|
36
|
-
url: str | None = None
|
|
37
|
-
email: str | None = None
|
|
38
|
-
|
|
39
|
-
model_config = pyd.ConfigDict(
|
|
40
|
-
extra="allow",
|
|
41
|
-
)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
class ServerRole(pyd.BaseModel):
|
|
45
|
-
name: str | None = None
|
|
46
|
-
description: str | None = None
|
|
47
|
-
model_config = pyd.ConfigDict(
|
|
48
|
-
extra="allow",
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
class Server(pyd.BaseModel):
|
|
53
|
-
type: str | None = None
|
|
54
|
-
description: str | None = None
|
|
55
|
-
environment: str | None = None
|
|
56
|
-
format: str | None = None
|
|
57
|
-
project: str | None = None
|
|
58
|
-
dataset: str | None = None
|
|
59
|
-
path: str | None = None
|
|
60
|
-
delimiter: str | None = None
|
|
61
|
-
endpointUrl: str | None = None
|
|
62
|
-
location: str | None = None
|
|
63
|
-
account: str | None = None
|
|
64
|
-
database: str | None = None
|
|
65
|
-
schema_: str | None = pyd.Field(default=None, alias="schema")
|
|
66
|
-
host: str | None = None
|
|
67
|
-
port: int | None = None
|
|
68
|
-
catalog: str | None = None
|
|
69
|
-
topic: str | None = None
|
|
70
|
-
http_path: str | None = None # Use ENV variable
|
|
71
|
-
token: str | None = None # Use ENV variable
|
|
72
|
-
dataProductId: str | None = None
|
|
73
|
-
outputPortId: str | None = None
|
|
74
|
-
driver: str | None = None
|
|
75
|
-
storageAccount: str | None = None
|
|
76
|
-
roles: List[ServerRole] = None
|
|
77
|
-
|
|
78
|
-
model_config = pyd.ConfigDict(
|
|
79
|
-
extra="allow",
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class Terms(pyd.BaseModel):
|
|
84
|
-
usage: str | None = None
|
|
85
|
-
limitations: str | None = None
|
|
86
|
-
billing: str | None = None
|
|
87
|
-
noticePeriod: str | None = None
|
|
88
|
-
description: str | None = None
|
|
89
|
-
|
|
90
|
-
model_config = pyd.ConfigDict(
|
|
91
|
-
extra="allow",
|
|
92
|
-
)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class Definition(pyd.BaseModel):
|
|
96
|
-
domain: str | None = None
|
|
97
|
-
name: str | None = None
|
|
98
|
-
title: str | None = None
|
|
99
|
-
description: str | None = None
|
|
100
|
-
type: str | None = None
|
|
101
|
-
enum: List[str] = []
|
|
102
|
-
format: str | None = None
|
|
103
|
-
minLength: int | None = None
|
|
104
|
-
maxLength: int | None = None
|
|
105
|
-
pattern: str | None = None
|
|
106
|
-
minimum: int | None = None
|
|
107
|
-
exclusiveMinimum: int | None = None
|
|
108
|
-
maximum: int | None = None
|
|
109
|
-
exclusiveMaximum: int | None = None
|
|
110
|
-
pii: bool | None = None
|
|
111
|
-
classification: str | None = None
|
|
112
|
-
fields: Dict[str, "Field"] = {}
|
|
113
|
-
items: "Field" = None
|
|
114
|
-
tags: List[str] = []
|
|
115
|
-
links: Dict[str, str] = {}
|
|
116
|
-
example: str | None = None
|
|
117
|
-
examples: List[Any] | None = None
|
|
118
|
-
|
|
119
|
-
model_config = pyd.ConfigDict(
|
|
120
|
-
extra="allow",
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
class Quality(pyd.BaseModel):
|
|
125
|
-
type: str | None = None
|
|
126
|
-
description: str | None = None
|
|
127
|
-
query: str | None = None
|
|
128
|
-
dialect: str | None = None
|
|
129
|
-
mustBe: int | None = None
|
|
130
|
-
mustNotBe: int | None = None
|
|
131
|
-
mustBeGreaterThan: int | None = None
|
|
132
|
-
mustBeGreaterThanOrEqualTo: int | None = None
|
|
133
|
-
mustBeLessThan: int | None = None
|
|
134
|
-
mustBeLessThanOrEqualTo: int | None = None
|
|
135
|
-
mustBeBetween: List[int] = None
|
|
136
|
-
mustNotBeBetween: List[int] = None
|
|
137
|
-
engine: str | None = None
|
|
138
|
-
implementation: str | Dict[str, Any] | None = None
|
|
139
|
-
|
|
140
|
-
model_config = pyd.ConfigDict(
|
|
141
|
-
extra="allow",
|
|
142
|
-
)
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
class Field(pyd.BaseModel):
|
|
146
|
-
ref: str = pyd.Field(default=None, alias="$ref")
|
|
147
|
-
title: str | None = None
|
|
148
|
-
type: str | None = None
|
|
149
|
-
format: str | None = None
|
|
150
|
-
required: bool | None = None
|
|
151
|
-
primary: bool = pyd.Field(
|
|
152
|
-
default=None,
|
|
153
|
-
deprecated="Removed in Data Contract Specification v1.1.0. Use primaryKey instead.",
|
|
154
|
-
)
|
|
155
|
-
primaryKey: bool | None = None
|
|
156
|
-
unique: bool | None = None
|
|
157
|
-
references: str | None = None
|
|
158
|
-
description: str | None = None
|
|
159
|
-
pii: bool | None = None
|
|
160
|
-
classification: str | None = None
|
|
161
|
-
pattern: str | None = None
|
|
162
|
-
minLength: int | None = None
|
|
163
|
-
maxLength: int | None = None
|
|
164
|
-
minimum: int | None = None
|
|
165
|
-
exclusiveMinimum: int | None = None
|
|
166
|
-
maximum: int | None = None
|
|
167
|
-
exclusiveMaximum: int | None = None
|
|
168
|
-
enum: List[str] | None = []
|
|
169
|
-
tags: List[str] | None = []
|
|
170
|
-
links: Dict[str, str] = {}
|
|
171
|
-
fields: Dict[str, "Field"] = {}
|
|
172
|
-
items: "Field" = None
|
|
173
|
-
keys: "Field" = None
|
|
174
|
-
values: "Field" = None
|
|
175
|
-
precision: int | None = None
|
|
176
|
-
scale: int | None = None
|
|
177
|
-
example: Any | None = pyd.Field(
|
|
178
|
-
default=None,
|
|
179
|
-
deprecated="Removed in Data Contract Specification v1.1.0. Use examples instead.",
|
|
180
|
-
)
|
|
181
|
-
examples: List[Any] | None = None
|
|
182
|
-
quality: List[Quality] | None = []
|
|
183
|
-
config: Dict[str, Any] | None = None
|
|
184
|
-
|
|
185
|
-
model_config = pyd.ConfigDict(
|
|
186
|
-
extra="allow",
|
|
187
|
-
)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
class Model(pyd.BaseModel):
|
|
191
|
-
description: str | None = None
|
|
192
|
-
type: str | None = None
|
|
193
|
-
namespace: str | None = None
|
|
194
|
-
title: str | None = None
|
|
195
|
-
fields: Dict[str, Field] = {}
|
|
196
|
-
quality: List[Quality] | None = []
|
|
197
|
-
primaryKey: List[str] | None = []
|
|
198
|
-
examples: List[Any] | None = None
|
|
199
|
-
config: Dict[str, Any] = None
|
|
200
|
-
tags: List[str] | None = None
|
|
201
|
-
|
|
202
|
-
model_config = pyd.ConfigDict(
|
|
203
|
-
extra="allow",
|
|
204
|
-
)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
class Info(pyd.BaseModel):
|
|
208
|
-
title: str | None = None
|
|
209
|
-
version: str | None = None
|
|
210
|
-
status: str | None = None
|
|
211
|
-
description: str | None = None
|
|
212
|
-
owner: str | None = None
|
|
213
|
-
contact: Contact | None = None
|
|
214
|
-
|
|
215
|
-
model_config = pyd.ConfigDict(
|
|
216
|
-
extra="allow",
|
|
217
|
-
)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
class Example(pyd.BaseModel):
|
|
221
|
-
type: str | None = None
|
|
222
|
-
description: str | None = None
|
|
223
|
-
model: str | None = None
|
|
224
|
-
data: str | object = None
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
# Deprecated Quality class
|
|
228
|
-
class DeprecatedQuality(pyd.BaseModel):
|
|
229
|
-
type: str | None = None
|
|
230
|
-
specification: str | object = None
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
class Availability(pyd.BaseModel):
|
|
234
|
-
description: str | None = None
|
|
235
|
-
percentage: str | None = None
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
class Retention(pyd.BaseModel):
|
|
239
|
-
description: str | None = None
|
|
240
|
-
period: str | None = None
|
|
241
|
-
unlimited: bool | None = None
|
|
242
|
-
timestampField: str | None = None
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
class Latency(pyd.BaseModel):
|
|
246
|
-
description: str | None = None
|
|
247
|
-
threshold: str | None = None
|
|
248
|
-
sourceTimestampField: str | None = None
|
|
249
|
-
processedTimestampField: str | None = None
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
class Freshness(pyd.BaseModel):
|
|
253
|
-
description: str | None = None
|
|
254
|
-
threshold: str | None = None
|
|
255
|
-
timestampField: str | None = None
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
class Frequency(pyd.BaseModel):
|
|
259
|
-
description: str | None = None
|
|
260
|
-
type: str | None = None
|
|
261
|
-
interval: str | None = None
|
|
262
|
-
cron: str | None = None
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
class Support(pyd.BaseModel):
|
|
266
|
-
description: str | None = None
|
|
267
|
-
time: str | None = None
|
|
268
|
-
responseTime: str | None = None
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
class Backup(pyd.BaseModel):
|
|
272
|
-
description: str | None = None
|
|
273
|
-
interval: str | None = None
|
|
274
|
-
cron: str | None = None
|
|
275
|
-
recoveryTime: str | None = None
|
|
276
|
-
recoveryPoint: str | None = None
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
class ServiceLevel(pyd.BaseModel):
|
|
280
|
-
availability: Availability | None = None
|
|
281
|
-
retention: Retention | None = None
|
|
282
|
-
latency: Latency | None = None
|
|
283
|
-
freshness: Freshness | None = None
|
|
284
|
-
frequency: Frequency | None = None
|
|
285
|
-
support: Support | None = None
|
|
286
|
-
backup: Backup | None = None
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
class DataContractSpecification(pyd.BaseModel):
|
|
290
|
-
dataContractSpecification: str | None = None
|
|
291
|
-
id: str | None = None
|
|
292
|
-
info: Info | None = None
|
|
293
|
-
servers: Dict[str, Server] = {}
|
|
294
|
-
terms: Terms | None = None
|
|
295
|
-
models: Dict[str, Model] = {}
|
|
296
|
-
definitions: Dict[str, Definition] = {}
|
|
297
|
-
examples: List[Example] = pyd.Field(
|
|
298
|
-
default_factory=list,
|
|
299
|
-
deprecated="Removed in Data Contract Specification " "v1.1.0. Use models.examples instead.",
|
|
300
|
-
)
|
|
301
|
-
quality: DeprecatedQuality | None = pyd.Field(
|
|
302
|
-
default=None,
|
|
303
|
-
deprecated="Removed in Data Contract Specification v1.1.0. Use " "model-level and field-level quality instead.",
|
|
304
|
-
)
|
|
305
|
-
servicelevels: ServiceLevel | None = None
|
|
306
|
-
links: Dict[str, str] = {}
|
|
307
|
-
tags: List[str] = []
|
|
308
|
-
|
|
309
|
-
@classmethod
|
|
310
|
-
def from_file(cls, file):
|
|
311
|
-
if not os.path.exists(file):
|
|
312
|
-
raise FileNotFoundError(f"The file '{file}' does not exist.")
|
|
313
|
-
with open(file, "r") as file:
|
|
314
|
-
file_content = file.read()
|
|
315
|
-
return DataContractSpecification.from_string(file_content)
|
|
316
|
-
|
|
317
|
-
@classmethod
|
|
318
|
-
def from_string(cls, data_contract_str):
|
|
319
|
-
data = yaml.safe_load(data_contract_str)
|
|
320
|
-
return DataContractSpecification(**data)
|
|
321
|
-
|
|
322
|
-
def to_yaml(self):
|
|
323
|
-
return yaml.safe_dump(
|
|
324
|
-
self.model_dump(mode="json", exclude_defaults=True, exclude_none=True, by_alias=True),
|
|
325
|
-
sort_keys=False,
|
|
326
|
-
allow_unicode=True,
|
|
327
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|