acryl-datahub-gx-plugin 1.3.1.10__py3-none-any.whl → 1.4.0rc1__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.
- {acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/METADATA +56 -56
- acryl_datahub_gx_plugin-1.4.0rc1.dist-info/RECORD +8 -0
- datahub_gx_plugin/_version.py +1 -1
- datahub_gx_plugin/action.py +83 -4
- acryl_datahub_gx_plugin-1.3.1.10.dist-info/RECORD +0 -8
- {acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/WHEEL +0 -0
- {acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/entry_points.txt +0 -0
- {acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/top_level.txt +0 -0
{acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/METADATA
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: acryl-datahub-gx-plugin
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.4.0rc1
|
|
4
4
|
Summary: Datahub GX plugin to capture executions and send to Datahub
|
|
5
5
|
Home-page: https://docs.datahub.com/
|
|
6
6
|
License: Apache-2.0
|
|
@@ -21,88 +21,88 @@ Classifier: Environment :: MacOS X
|
|
|
21
21
|
Classifier: Topic :: Software Development
|
|
22
22
|
Requires-Python: >=3.10
|
|
23
23
|
Description-Content-Type: text/markdown
|
|
24
|
+
Requires-Dist: sqlalchemy<2,>=1.4.39
|
|
24
25
|
Requires-Dist: requests_file
|
|
25
26
|
Requires-Dist: great-expectations<1.0.0,>=0.17.15
|
|
26
27
|
Requires-Dist: pydantic>=2.1.0
|
|
28
|
+
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.4.0rc1
|
|
27
29
|
Requires-Dist: requests
|
|
28
|
-
Requires-Dist: sqlalchemy<2,>=1.4.39
|
|
29
|
-
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.3.1.10
|
|
30
30
|
Requires-Dist: traitlets!=5.2.2
|
|
31
31
|
Provides-Extra: ignore
|
|
32
32
|
Provides-Extra: dev
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist: pydantic>=2.1.0; extra == "dev"
|
|
35
|
-
Requires-Dist: types-six; extra == "dev"
|
|
36
|
-
Requires-Dist: jsonpickle; extra == "dev"
|
|
37
|
-
Requires-Dist: types-python-dateutil; extra == "dev"
|
|
33
|
+
Requires-Dist: tox; extra == "dev"
|
|
38
34
|
Requires-Dist: twine; extra == "dev"
|
|
39
|
-
Requires-Dist: ruff==0.11.7; extra == "dev"
|
|
40
|
-
Requires-Dist: types-click==0.1.12; extra == "dev"
|
|
41
|
-
Requires-Dist: types-PyYAML; extra == "dev"
|
|
42
|
-
Requires-Dist: great-expectations<1.0.0,>=0.17.15; extra == "dev"
|
|
43
|
-
Requires-Dist: requests-mock; extra == "dev"
|
|
44
35
|
Requires-Dist: mypy==1.17.1; extra == "dev"
|
|
45
|
-
Requires-Dist:
|
|
46
|
-
Requires-Dist:
|
|
47
|
-
Requires-Dist:
|
|
48
|
-
Requires-Dist:
|
|
36
|
+
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.4.0rc1; extra == "dev"
|
|
37
|
+
Requires-Dist: jsonpickle; extra == "dev"
|
|
38
|
+
Requires-Dist: packaging; extra == "dev"
|
|
39
|
+
Requires-Dist: build; extra == "dev"
|
|
40
|
+
Requires-Dist: types-requests; extra == "dev"
|
|
49
41
|
Requires-Dist: pytest-cov>=2.8.1; extra == "dev"
|
|
50
|
-
Requires-Dist: requests; extra == "dev"
|
|
51
42
|
Requires-Dist: types-tabulate; extra == "dev"
|
|
52
|
-
Requires-Dist:
|
|
53
|
-
Requires-Dist:
|
|
54
|
-
Requires-Dist:
|
|
43
|
+
Requires-Dist: requests; extra == "dev"
|
|
44
|
+
Requires-Dist: ruff==0.11.7; extra == "dev"
|
|
45
|
+
Requires-Dist: types-PyYAML; extra == "dev"
|
|
46
|
+
Requires-Dist: sqlalchemy<2,>=1.4.39; extra == "dev"
|
|
55
47
|
Requires-Dist: types-toml; extra == "dev"
|
|
48
|
+
Requires-Dist: types-python-dateutil; extra == "dev"
|
|
49
|
+
Requires-Dist: pytest-asyncio>=0.16.0; extra == "dev"
|
|
50
|
+
Requires-Dist: traitlets!=5.2.2; extra == "dev"
|
|
51
|
+
Requires-Dist: pytest>=6.2.2; extra == "dev"
|
|
56
52
|
Requires-Dist: types-dataclasses; extra == "dev"
|
|
57
|
-
Requires-Dist:
|
|
53
|
+
Requires-Dist: requests_file; extra == "dev"
|
|
54
|
+
Requires-Dist: coverage>=5.1; extra == "dev"
|
|
55
|
+
Requires-Dist: pydantic>=2.1.0; extra == "dev"
|
|
56
|
+
Requires-Dist: types-six; extra == "dev"
|
|
58
57
|
Requires-Dist: freezegun; extra == "dev"
|
|
59
|
-
Requires-Dist:
|
|
60
|
-
Requires-Dist: traitlets!=5.2.2; extra == "dev"
|
|
61
|
-
Requires-Dist: types-pytz; extra == "dev"
|
|
58
|
+
Requires-Dist: types-setuptools; extra == "dev"
|
|
62
59
|
Requires-Dist: types-freezegun; extra == "dev"
|
|
63
|
-
Requires-Dist: types-cachetools; extra == "dev"
|
|
64
|
-
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.3.1.10; extra == "dev"
|
|
65
60
|
Requires-Dist: deepdiff!=8.0.0; extra == "dev"
|
|
66
|
-
Requires-Dist:
|
|
61
|
+
Requires-Dist: types-pytz; extra == "dev"
|
|
62
|
+
Requires-Dist: types-click==0.1.12; extra == "dev"
|
|
63
|
+
Requires-Dist: great-expectations<1.0.0,>=0.17.15; extra == "dev"
|
|
64
|
+
Requires-Dist: requests-mock; extra == "dev"
|
|
65
|
+
Requires-Dist: sqlalchemy-stubs; extra == "dev"
|
|
66
|
+
Requires-Dist: types-cachetools; extra == "dev"
|
|
67
67
|
Provides-Extra: integration-tests
|
|
68
|
-
Requires-Dist:
|
|
69
|
-
Requires-Dist: pydantic>=2.1.0; extra == "integration-tests"
|
|
70
|
-
Requires-Dist: types-six; extra == "integration-tests"
|
|
68
|
+
Requires-Dist: tox; extra == "integration-tests"
|
|
71
69
|
Requires-Dist: pyspark; extra == "integration-tests"
|
|
72
|
-
Requires-Dist: acryl-datahub[testing-utils]==1.3.1.10; extra == "integration-tests"
|
|
73
|
-
Requires-Dist: jsonpickle; extra == "integration-tests"
|
|
74
|
-
Requires-Dist: types-python-dateutil; extra == "integration-tests"
|
|
75
70
|
Requires-Dist: twine; extra == "integration-tests"
|
|
76
|
-
Requires-Dist: ruff==0.11.7; extra == "integration-tests"
|
|
77
|
-
Requires-Dist: types-click==0.1.12; extra == "integration-tests"
|
|
78
|
-
Requires-Dist: types-PyYAML; extra == "integration-tests"
|
|
79
|
-
Requires-Dist: great-expectations<1.0.0,>=0.17.15; extra == "integration-tests"
|
|
80
|
-
Requires-Dist: requests-mock; extra == "integration-tests"
|
|
81
|
-
Requires-Dist: psycopg2-binary; extra == "integration-tests"
|
|
82
71
|
Requires-Dist: mypy==1.17.1; extra == "integration-tests"
|
|
83
|
-
Requires-Dist:
|
|
84
|
-
Requires-Dist:
|
|
85
|
-
Requires-Dist:
|
|
86
|
-
Requires-Dist:
|
|
72
|
+
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.4.0rc1; extra == "integration-tests"
|
|
73
|
+
Requires-Dist: jsonpickle; extra == "integration-tests"
|
|
74
|
+
Requires-Dist: packaging; extra == "integration-tests"
|
|
75
|
+
Requires-Dist: build; extra == "integration-tests"
|
|
76
|
+
Requires-Dist: psycopg2-binary; extra == "integration-tests"
|
|
77
|
+
Requires-Dist: types-requests; extra == "integration-tests"
|
|
87
78
|
Requires-Dist: pytest-cov>=2.8.1; extra == "integration-tests"
|
|
88
|
-
Requires-Dist:
|
|
79
|
+
Requires-Dist: acryl-datahub[testing-utils]==1.4.0rc1; extra == "integration-tests"
|
|
89
80
|
Requires-Dist: types-tabulate; extra == "integration-tests"
|
|
90
|
-
Requires-Dist:
|
|
91
|
-
Requires-Dist:
|
|
92
|
-
Requires-Dist:
|
|
81
|
+
Requires-Dist: requests; extra == "integration-tests"
|
|
82
|
+
Requires-Dist: ruff==0.11.7; extra == "integration-tests"
|
|
83
|
+
Requires-Dist: types-PyYAML; extra == "integration-tests"
|
|
84
|
+
Requires-Dist: sqlalchemy<2,>=1.4.39; extra == "integration-tests"
|
|
93
85
|
Requires-Dist: types-toml; extra == "integration-tests"
|
|
94
|
-
Requires-Dist: types-
|
|
95
|
-
Requires-Dist:
|
|
96
|
-
Requires-Dist: freezegun; extra == "integration-tests"
|
|
97
|
-
Requires-Dist: tox; extra == "integration-tests"
|
|
86
|
+
Requires-Dist: types-python-dateutil; extra == "integration-tests"
|
|
87
|
+
Requires-Dist: pytest-asyncio>=0.16.0; extra == "integration-tests"
|
|
98
88
|
Requires-Dist: pytest-docker>=1.1.0; extra == "integration-tests"
|
|
99
89
|
Requires-Dist: traitlets!=5.2.2; extra == "integration-tests"
|
|
100
|
-
Requires-Dist:
|
|
90
|
+
Requires-Dist: pytest>=6.2.2; extra == "integration-tests"
|
|
91
|
+
Requires-Dist: types-dataclasses; extra == "integration-tests"
|
|
92
|
+
Requires-Dist: requests_file; extra == "integration-tests"
|
|
93
|
+
Requires-Dist: coverage>=5.1; extra == "integration-tests"
|
|
94
|
+
Requires-Dist: pydantic>=2.1.0; extra == "integration-tests"
|
|
95
|
+
Requires-Dist: types-six; extra == "integration-tests"
|
|
96
|
+
Requires-Dist: freezegun; extra == "integration-tests"
|
|
97
|
+
Requires-Dist: types-setuptools; extra == "integration-tests"
|
|
101
98
|
Requires-Dist: types-freezegun; extra == "integration-tests"
|
|
102
|
-
Requires-Dist: types-cachetools; extra == "integration-tests"
|
|
103
|
-
Requires-Dist: acryl-datahub[datahub-rest,sql-parser]==1.3.1.10; extra == "integration-tests"
|
|
104
99
|
Requires-Dist: deepdiff!=8.0.0; extra == "integration-tests"
|
|
105
|
-
Requires-Dist:
|
|
100
|
+
Requires-Dist: types-pytz; extra == "integration-tests"
|
|
101
|
+
Requires-Dist: types-click==0.1.12; extra == "integration-tests"
|
|
102
|
+
Requires-Dist: great-expectations<1.0.0,>=0.17.15; extra == "integration-tests"
|
|
103
|
+
Requires-Dist: requests-mock; extra == "integration-tests"
|
|
104
|
+
Requires-Dist: sqlalchemy-stubs; extra == "integration-tests"
|
|
105
|
+
Requires-Dist: types-cachetools; extra == "integration-tests"
|
|
106
106
|
Dynamic: classifier
|
|
107
107
|
Dynamic: description
|
|
108
108
|
Dynamic: description-content-type
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
datahub_gx_plugin/__init__.py,sha256=EAwU2Z4u9abD5xHwcfgwo1xvK8-lSfByM-cp0IMw4mQ,69
|
|
2
|
+
datahub_gx_plugin/_version.py,sha256=ioPtKcLHTY5xpvxAxlsbIJoRSU0XOZQPW9dd8N_ZjLI,136
|
|
3
|
+
datahub_gx_plugin/action.py,sha256=jG8CXw6jszl8R_Oeq9Y0M8IPQp0iIdqNGxa4YI9LTVo,43401
|
|
4
|
+
acryl_datahub_gx_plugin-1.4.0rc1.dist-info/METADATA,sha256=lDP9FxQ60_6Gcye8Dg4IvRHEGLh01-Q4ykRflHi_188,5645
|
|
5
|
+
acryl_datahub_gx_plugin-1.4.0rc1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
6
|
+
acryl_datahub_gx_plugin-1.4.0rc1.dist-info/entry_points.txt,sha256=MPipKHfWSerlcRwWt8OP93TPCVxpposDMyILo9cszbM,88
|
|
7
|
+
acryl_datahub_gx_plugin-1.4.0rc1.dist-info/top_level.txt,sha256=ryn3FMtO1isrM-TbO-SRYy_-31fUpgdEBmBSrAmvL1c,18
|
|
8
|
+
acryl_datahub_gx_plugin-1.4.0rc1.dist-info/RECORD,,
|
datahub_gx_plugin/_version.py
CHANGED
datahub_gx_plugin/action.py
CHANGED
|
@@ -38,9 +38,11 @@ from sqlalchemy.engine.url import make_url
|
|
|
38
38
|
|
|
39
39
|
import datahub.emitter.mce_builder as builder
|
|
40
40
|
from datahub.cli.env_utils import get_boolean_env_variable
|
|
41
|
+
from datahub.emitter.aspect import JSON_PATCH_CONTENT_TYPE
|
|
41
42
|
from datahub.emitter.mcp import MetadataChangeProposalWrapper
|
|
42
43
|
from datahub.emitter.rest_emitter import DatahubRestEmitter
|
|
43
44
|
from datahub.emitter.serialization_helper import pre_json_transform
|
|
45
|
+
from datahub.ingestion.graph.client import DataHubGraph
|
|
44
46
|
from datahub.ingestion.graph.config import ClientMode
|
|
45
47
|
from datahub.ingestion.source.sql.sqlalchemy_uri_mapper import (
|
|
46
48
|
get_platform_from_sqlalchemy_uri,
|
|
@@ -62,9 +64,16 @@ from datahub.metadata.com.linkedin.pegasus2avro.assertion import (
|
|
|
62
64
|
DatasetAssertionScope,
|
|
63
65
|
)
|
|
64
66
|
from datahub.metadata.com.linkedin.pegasus2avro.common import DataPlatformInstance
|
|
65
|
-
from datahub.metadata.schema_classes import
|
|
67
|
+
from datahub.metadata.schema_classes import (
|
|
68
|
+
ChangeTypeClass,
|
|
69
|
+
GenericAspectClass,
|
|
70
|
+
MetadataChangeProposalClass,
|
|
71
|
+
PartitionSpecClass,
|
|
72
|
+
PartitionTypeClass,
|
|
73
|
+
)
|
|
66
74
|
from datahub.sql_parsing.sqlglot_lineage import create_lineage_sql_parsed_result
|
|
67
75
|
from datahub.utilities.urns.dataset_urn import DatasetUrn
|
|
76
|
+
from datahub.utilities.urns.urn import guess_entity_type
|
|
68
77
|
|
|
69
78
|
# TODO: move this and version check used in tests to some common module
|
|
70
79
|
try:
|
|
@@ -192,15 +201,16 @@ class DataHubValidationAction(ValidationAction):
|
|
|
192
201
|
logger.info("Sending metadata to datahub ...")
|
|
193
202
|
logger.info("Dataset URN - {urn}".format(urn=datasets[0]["dataset_urn"]))
|
|
194
203
|
|
|
204
|
+
graph = emitter.to_graph()
|
|
205
|
+
|
|
195
206
|
for assertion in assertions:
|
|
196
207
|
logger.info(
|
|
197
208
|
"Assertion URN - {urn}".format(urn=assertion["assertionUrn"])
|
|
198
209
|
)
|
|
199
210
|
|
|
200
211
|
# Construct a MetadataChangeProposalWrapper object.
|
|
201
|
-
assertion_info_mcp =
|
|
202
|
-
|
|
203
|
-
aspect=assertion["assertionInfo"],
|
|
212
|
+
assertion_info_mcp = self._build_assertion_info_mcp(
|
|
213
|
+
graph, assertion["assertionUrn"], assertion["assertionInfo"]
|
|
204
214
|
)
|
|
205
215
|
emitter.emit_mcp(assertion_info_mcp)
|
|
206
216
|
|
|
@@ -231,6 +241,75 @@ class DataHubValidationAction(ValidationAction):
|
|
|
231
241
|
|
|
232
242
|
return {"datahub_notification_result": result}
|
|
233
243
|
|
|
244
|
+
def _build_assertion_info_mcp(
|
|
245
|
+
self,
|
|
246
|
+
graph: DataHubGraph,
|
|
247
|
+
assertion_urn: str,
|
|
248
|
+
assertion_info: AssertionInfo,
|
|
249
|
+
) -> Union[MetadataChangeProposalWrapper, MetadataChangeProposalClass]:
|
|
250
|
+
try:
|
|
251
|
+
existing_info = graph.get_aspect(assertion_urn, AssertionInfo)
|
|
252
|
+
except Exception:
|
|
253
|
+
logger.warning(
|
|
254
|
+
"Failed to check existing assertionInfo. Falling back to upsert.",
|
|
255
|
+
exc_info=True,
|
|
256
|
+
)
|
|
257
|
+
existing_info = None
|
|
258
|
+
|
|
259
|
+
if existing_info is None:
|
|
260
|
+
return MetadataChangeProposalWrapper(
|
|
261
|
+
entityUrn=assertion_urn,
|
|
262
|
+
aspect=assertion_info,
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
return self._build_assertion_info_patch(assertion_urn, assertion_info)
|
|
266
|
+
|
|
267
|
+
def _build_assertion_info_patch(
|
|
268
|
+
self,
|
|
269
|
+
assertion_urn: str,
|
|
270
|
+
assertion_info: AssertionInfo,
|
|
271
|
+
) -> MetadataChangeProposalClass:
|
|
272
|
+
assertion_info_obj = assertion_info.to_obj()
|
|
273
|
+
patch_ops = []
|
|
274
|
+
|
|
275
|
+
if "type" in assertion_info_obj:
|
|
276
|
+
patch_ops.append(
|
|
277
|
+
{"op": "add", "path": "/type", "value": assertion_info_obj["type"]}
|
|
278
|
+
)
|
|
279
|
+
if "datasetAssertion" in assertion_info_obj:
|
|
280
|
+
patch_ops.append(
|
|
281
|
+
{
|
|
282
|
+
"op": "add",
|
|
283
|
+
"path": "/datasetAssertion",
|
|
284
|
+
"value": assertion_info_obj["datasetAssertion"],
|
|
285
|
+
}
|
|
286
|
+
)
|
|
287
|
+
custom_properties = assertion_info_obj.get("customProperties") or {}
|
|
288
|
+
expectation_suite_name = custom_properties.get("expectation_suite_name")
|
|
289
|
+
if expectation_suite_name is not None:
|
|
290
|
+
patch_ops.append(
|
|
291
|
+
{
|
|
292
|
+
"op": "add",
|
|
293
|
+
"path": "/customProperties/expectation_suite_name",
|
|
294
|
+
"value": expectation_suite_name,
|
|
295
|
+
}
|
|
296
|
+
)
|
|
297
|
+
|
|
298
|
+
aspect_payload = {
|
|
299
|
+
"patch": pre_json_transform(patch_ops),
|
|
300
|
+
"forceGenericPatch": True,
|
|
301
|
+
}
|
|
302
|
+
return MetadataChangeProposalClass(
|
|
303
|
+
entityUrn=assertion_urn,
|
|
304
|
+
entityType=guess_entity_type(assertion_urn),
|
|
305
|
+
changeType=ChangeTypeClass.PATCH,
|
|
306
|
+
aspectName="assertionInfo",
|
|
307
|
+
aspect=GenericAspectClass(
|
|
308
|
+
value=json.dumps(pre_json_transform(aspect_payload)).encode(),
|
|
309
|
+
contentType=JSON_PATCH_CONTENT_TYPE,
|
|
310
|
+
),
|
|
311
|
+
)
|
|
312
|
+
|
|
234
313
|
def get_assertions_with_results(
|
|
235
314
|
self,
|
|
236
315
|
validation_result_suite,
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
datahub_gx_plugin/__init__.py,sha256=EAwU2Z4u9abD5xHwcfgwo1xvK8-lSfByM-cp0IMw4mQ,69
|
|
2
|
-
datahub_gx_plugin/_version.py,sha256=4Fq_nLSQx3815zzf8MmBmv7QVP1Wn5smqeGsi0LNn9E,136
|
|
3
|
-
datahub_gx_plugin/action.py,sha256=d6H0daSN0SrZ46ZfNPdVwldQYk1eJcSryHSC6cWnjM8,40665
|
|
4
|
-
acryl_datahub_gx_plugin-1.3.1.10.dist-info/METADATA,sha256=sq-Y2Go6ayBSnitLuxgLlp0HXpiWqfj2G8QUF3HnDgo,5645
|
|
5
|
-
acryl_datahub_gx_plugin-1.3.1.10.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
6
|
-
acryl_datahub_gx_plugin-1.3.1.10.dist-info/entry_points.txt,sha256=MPipKHfWSerlcRwWt8OP93TPCVxpposDMyILo9cszbM,88
|
|
7
|
-
acryl_datahub_gx_plugin-1.3.1.10.dist-info/top_level.txt,sha256=ryn3FMtO1isrM-TbO-SRYy_-31fUpgdEBmBSrAmvL1c,18
|
|
8
|
-
acryl_datahub_gx_plugin-1.3.1.10.dist-info/RECORD,,
|
{acryl_datahub_gx_plugin-1.3.1.10.dist-info → acryl_datahub_gx_plugin-1.4.0rc1.dist-info}/WHEEL
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|