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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: acryl-datahub-gx-plugin
3
- Version: 1.3.1.10
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: coverage>=5.1; extra == "dev"
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: types-setuptools; extra == "dev"
46
- Requires-Dist: requests_file; extra == "dev"
47
- Requires-Dist: pytest>=6.2.2; extra == "dev"
48
- Requires-Dist: sqlalchemy<2,>=1.4.39; extra == "dev"
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: sqlalchemy-stubs; extra == "dev"
53
- Requires-Dist: build; extra == "dev"
54
- Requires-Dist: packaging; extra == "dev"
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: types-requests; extra == "dev"
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: tox; extra == "dev"
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: pytest-asyncio>=0.16.0; extra == "dev"
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: coverage>=5.1; extra == "integration-tests"
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: types-setuptools; extra == "integration-tests"
84
- Requires-Dist: requests_file; extra == "integration-tests"
85
- Requires-Dist: pytest>=6.2.2; extra == "integration-tests"
86
- Requires-Dist: sqlalchemy<2,>=1.4.39; extra == "integration-tests"
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: requests; extra == "integration-tests"
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: sqlalchemy-stubs; extra == "integration-tests"
91
- Requires-Dist: build; extra == "integration-tests"
92
- Requires-Dist: packaging; extra == "integration-tests"
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-dataclasses; extra == "integration-tests"
95
- Requires-Dist: types-requests; extra == "integration-tests"
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: types-pytz; extra == "integration-tests"
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: pytest-asyncio>=0.16.0; extra == "integration-tests"
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,,
@@ -1,3 +1,3 @@
1
1
  # Published at https://pypi.org/project/acryl-datahub-gx-plugin/.
2
2
  __package_name__ = "acryl-datahub-gx-plugin"
3
- __version__ = "1.3.1.10"
3
+ __version__ = "1.4.0rc1"
@@ -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 PartitionSpecClass, PartitionTypeClass
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 = MetadataChangeProposalWrapper(
202
- entityUrn=assertion["assertionUrn"],
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,,