acryl-datahub 1.1.0.1__py3-none-any.whl → 1.1.0.2rc1__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 acryl-datahub might be problematic. Click here for more details.

Files changed (25) hide show
  1. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/METADATA +2516 -2516
  2. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/RECORD +25 -23
  3. datahub/_version.py +1 -1
  4. datahub/api/entities/external/lake_formation_external_entites.py +161 -0
  5. datahub/api/entities/external/restricted_text.py +10 -10
  6. datahub/api/entities/external/unity_catalog_external_entites.py +5 -2
  7. datahub/emitter/rest_emitter.py +29 -4
  8. datahub/ingestion/graph/client.py +2 -0
  9. datahub/ingestion/graph/config.py +1 -0
  10. datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py +20 -10
  11. datahub/ingestion/sink/datahub_rest.py +1 -0
  12. datahub/ingestion/source/aws/aws_common.py +4 -0
  13. datahub/ingestion/source/aws/glue.py +488 -243
  14. datahub/ingestion/source/aws/tag_entities.py +292 -0
  15. datahub/ingestion/source/sql/mssql/source.py +207 -18
  16. datahub/ingestion/source/unity/source.py +2 -3
  17. datahub/metadata/_internal_schema_classes.py +499 -499
  18. datahub/metadata/_urns/urn_defs.py +1766 -1766
  19. datahub/metadata/schema.avsc +17480 -17093
  20. datahub/metadata/schemas/__init__.py +3 -3
  21. datahub/sdk/main_client.py +3 -3
  22. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/WHEEL +0 -0
  23. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/entry_points.txt +0 -0
  24. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/licenses/LICENSE +0 -0
  25. {acryl_datahub-1.1.0.1.dist-info → acryl_datahub-1.1.0.2rc1.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,7 @@
1
- acryl_datahub-1.1.0.1.dist-info/licenses/LICENSE,sha256=9xNHpsD0uYF5ONzXsKDCuHHB-xbiCrSbueWXqrTNsxk,11365
1
+ acryl_datahub-1.1.0.2rc1.dist-info/licenses/LICENSE,sha256=9xNHpsD0uYF5ONzXsKDCuHHB-xbiCrSbueWXqrTNsxk,11365
2
2
  datahub/__init__.py,sha256=aq_i5lVREmoLfYIqcx_pEQicO855YlhD19tWc1eZZNI,59
3
3
  datahub/__main__.py,sha256=pegIvQ9hzK7IhqVeUi1MeADSZ2QlP-D3K0OQdEg55RU,106
4
- datahub/_version.py,sha256=EUCEKqlhMB2QuynJETP9W-B79mTRiuh0QubMytQlbzE,320
4
+ datahub/_version.py,sha256=xviXMZWidai-tecst_TvEVpDRvpRUSKWgx_4dTs7IJ8,323
5
5
  datahub/entrypoints.py,sha256=H-YFTvxTJOgpWsFBVlxyb1opjkq-hjTzNmjy5Fq3RHg,8992
6
6
  datahub/errors.py,sha256=p5rFAdAGVCk4Lqolol1YvthceadUSwpaCxLXRcyCCFQ,676
7
7
  datahub/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -52,8 +52,9 @@ datahub/api/entities/dataset/dataset.py,sha256=BLOn7o-A3OLD4D2JTq8vF_dwTTW9HHDnD
52
52
  datahub/api/entities/external/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  datahub/api/entities/external/external_entities.py,sha256=7HRt3Oz2sw_7BDxEVc6W7jK4UqHXLZuo_rGPJ5NdAoE,7727
54
54
  datahub/api/entities/external/external_tag.py,sha256=LKz4j2KnBvo8xhGLxA9g1DWtHfHUA7WqO2vOIsqwy44,4490
55
- datahub/api/entities/external/restricted_text.py,sha256=-cQbvWuLpU7SONz1F7tdnvz4xQmbZsnUZwCD7vFQO_o,8615
56
- datahub/api/entities/external/unity_catalog_external_entites.py,sha256=YgiABocF8RhkWiYbYfalYuKiJEd3JEYXSPmJGyfDlrU,5869
55
+ datahub/api/entities/external/lake_formation_external_entites.py,sha256=7tX3oC5O7DoknMDY4TSzjEf6zfzErFWDYD-CrbmItpA,5703
56
+ datahub/api/entities/external/restricted_text.py,sha256=IX_HtG0pnPB7mnSkd_9ptlNLJar2Bq2cfwq9CqQ3giE,8643
57
+ datahub/api/entities/external/unity_catalog_external_entites.py,sha256=pzLifF6U8NzUz11z5Lhv8VJLHw5D_51wa5CRnYji4ZE,6072
57
58
  datahub/api/entities/forms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
58
59
  datahub/api/entities/forms/forms.py,sha256=B1KnoMmaXwznWdbjltoLq3sH9qj-BpzyC7z7FcwwOM4,15812
59
60
  datahub/api/entities/forms/forms_graphql_constants.py,sha256=DKpnKlMKTjmnyrCTvp63V4LX4THGTAMq3ep8THrSGP4,537
@@ -131,7 +132,7 @@ datahub/emitter/mcp_builder.py,sha256=8IwJAlolQkPpMqQJPLtGrsUqAcuFNs98nrI5iYUxga
131
132
  datahub/emitter/mcp_patch_builder.py,sha256=u7cpW6DkiN7KpLapmMaXgL_FneoN69boxiANbVgMdSI,4564
132
133
  datahub/emitter/request_helper.py,sha256=2Sij9VJqgA7xZI6I7IuxsA8ioakbz0FJ3gvazxU_z3M,5738
133
134
  datahub/emitter/response_helper.py,sha256=qGm45n43CepW7j6kP9wTXuP-U-SZnn7hQdJTdVaoqhQ,7504
134
- datahub/emitter/rest_emitter.py,sha256=0_jZbHQNVm1DGlHKuFMJkTWvWvxy7HxcCZDgjldHbKk,36410
135
+ datahub/emitter/rest_emitter.py,sha256=ctPrtQ1S9wsy_lqE9LopP5pvmLn83Mu5R1mfSf9umdY,37467
135
136
  datahub/emitter/serialization_helper.py,sha256=q12Avmf70Vy4ttQGMJoTKlE5EsybMKNg2w3MQeZiHvk,3652
136
137
  datahub/emitter/sql_parsing_builder.py,sha256=Cr5imZrm3dYDSCACt5MFscgHCtVbHTD6IjUmsvsKoEs,11991
137
138
  datahub/emitter/synchronized_file_emitter.py,sha256=s4ATuxalI4GDAkrZTaGSegxBdvvNPZ9jRSdtElU0kNs,1805
@@ -176,14 +177,14 @@ datahub/ingestion/glossary/classifier.py,sha256=daLxnVv_JlfB_jBOxH5LrU_xQRndrsGo
176
177
  datahub/ingestion/glossary/classifier_registry.py,sha256=yFOYLQhDgCLqXYMG3L1BquXafeLcZDcmp8meyw6k9ts,307
177
178
  datahub/ingestion/glossary/datahub_classifier.py,sha256=O7wm6gQT1Jf2QSKdWjJQbS5oSzJwplXzfza26Gdq5Mg,7555
178
179
  datahub/ingestion/graph/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
179
- datahub/ingestion/graph/client.py,sha256=B0lg9ukuTbT2cD03Hxax5eEM_pwIYJSblcOzp2LKZ68,70620
180
- datahub/ingestion/graph/config.py,sha256=hNu2CztDhUeWXoQA34mU-54H3aN4i3vMUfOoWYhihp8,958
180
+ datahub/ingestion/graph/client.py,sha256=apsLaAWqvJN6nIEL-T-BFkkvBhAr64RS07YRl0PoVu4,70790
181
+ datahub/ingestion/graph/config.py,sha256=rmkcqAL8fJoY9QyAeS0Xm8HvwHzV3pCjY-Om-50JJTI,1015
181
182
  datahub/ingestion/graph/connections.py,sha256=9462L0ZWGKURyypAln25eMPhK3pcufBar9tNDoqspXs,741
182
183
  datahub/ingestion/graph/entity_versioning.py,sha256=nrcNz0Qm6kpE6oTu_mrYUQDx14KPspBTc6R9SyFUY6c,6901
183
184
  datahub/ingestion/graph/filters.py,sha256=OfjKhuNRHHLvhHk6Tfwd2IbMLPbbIq4VUyHaSpcDvKk,8664
184
185
  datahub/ingestion/graph/links.py,sha256=UwWSdx-j0dPttfJOjfTf4ZmlO7iIsRz5p3nIsqGVHUA,2169
185
186
  datahub/ingestion/reporting/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
186
- datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py,sha256=iEulcZMLBQuUfe9MAYyobMekvMcNm4dqVcS_C_2KfrI,9736
187
+ datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py,sha256=6P8pFLHF6R8d5iU_L_9wWKPj9gITxrqAemJlQGd-ZCs,10025
187
188
  datahub/ingestion/reporting/file_reporter.py,sha256=tiWukmMxHrTQI3rOAumsq6lRlw8T6spqpS6XBDYnrZU,1640
188
189
  datahub/ingestion/reporting/reporting_provider_registry.py,sha256=jTYSh3T4sensjnHQfPLiIcbA2dG8w0px9ghChAJjGdU,310
189
190
  datahub/ingestion/run/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -196,7 +197,7 @@ datahub/ingestion/sink/blackhole.py,sha256=-jYcWo4i8q7312bCIoHrGr7nT9JdPvA7c4jvS
196
197
  datahub/ingestion/sink/console.py,sha256=TZfhA0Ec2eNCrMH7RRy2JOdUE-U-hkoIQrPm1CmKLQs,591
197
198
  datahub/ingestion/sink/datahub_kafka.py,sha256=_cjuXu5I6G0zJ2UK7hMbaKjMPZXeIwRMgm7CVeTiNtc,2578
198
199
  datahub/ingestion/sink/datahub_lite.py,sha256=7u2aWm7ENLshKHl-PkjJg6Mrw4bWs8sTfKIBz4mm8Ak,1879
199
- datahub/ingestion/sink/datahub_rest.py,sha256=hWvqilNlKUlkL_i6xiE-t4c_IXdYCD5gILf5R-Zaym4,13032
200
+ datahub/ingestion/sink/datahub_rest.py,sha256=xXCYqYMc9DuNQv22DBYrEpJFvGBrKVPmZuaZRbMOONA,13089
200
201
  datahub/ingestion/sink/file.py,sha256=SxXJPJpkIGoaqRjCcSmj2ZE3xE4rLlBABBGwpTj5LWI,3271
201
202
  datahub/ingestion/sink/sink_registry.py,sha256=JRBWx8qEYg0ubSTyhqwgSWctgxwyp6fva9GoN2LwBao,490
202
203
  datahub/ingestion/source/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -233,11 +234,12 @@ datahub/ingestion/source/abs/source.py,sha256=cuMezUzr-Smp5tok2ceYor5I5jp52NDMjf
233
234
  datahub/ingestion/source/apply/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
234
235
  datahub/ingestion/source/apply/datahub_apply.py,sha256=xTD-Iq3UHhxcz61RwNuI2kJjRrnQEfZFSgvS1X6loV4,7703
235
236
  datahub/ingestion/source/aws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
- datahub/ingestion/source/aws/aws_common.py,sha256=DfdQgkJ_s2isFx8WvqKTlAcBk4KE8SgfpmA5BgC3fgY,17716
237
- datahub/ingestion/source/aws/glue.py,sha256=JHvxgufm94pvlefcgARpLwIjAtHcA-EvbFAMR0YLAAA,58087
237
+ datahub/ingestion/source/aws/aws_common.py,sha256=DN49pHY-AOVHqI3smF9cVPwvPmh5UqOF4ga-wga_gPc,17928
238
+ datahub/ingestion/source/aws/glue.py,sha256=E_oCgf-taI2ZVXSn9LA9MoDk6JJBFEDBUbNIFkqUUSA,66547
238
239
  datahub/ingestion/source/aws/s3_boto_utils.py,sha256=Y54jlLV5gLcuZ4Zs57kIW5dYHD89RSFfsVNlFbRnSkQ,3901
239
240
  datahub/ingestion/source/aws/s3_util.py,sha256=OFypcgmVC6jnZM90-gjcPpAMtTV1lbnreCaMhCzNlzs,2149
240
241
  datahub/ingestion/source/aws/sagemaker.py,sha256=Bl2tkBYnrindgx61VHYgNovUF_Kp_fXNcivQn28vC2w,5254
242
+ datahub/ingestion/source/aws/tag_entities.py,sha256=mMA1u2rL4bdL3ZS7DAtkeeiTk1gVIk-Ct3klHE-ppVs,11273
241
243
  datahub/ingestion/source/aws/sagemaker_processors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
242
244
  datahub/ingestion/source/aws/sagemaker_processors/common.py,sha256=x4ijMxKjZ-oJdqGyTwBp2J50uxYT1ejlVlGs8-vDXMU,2234
243
245
  datahub/ingestion/source/aws/sagemaker_processors/feature_groups.py,sha256=IUwPTSITL-RaO3i3lX_KaDwOGPNMXHf66PPWAcMglWI,10383
@@ -505,7 +507,7 @@ datahub/ingestion/source/sql/two_tier_sql_source.py,sha256=AB3Gtx4omAy_08zadHQpm
505
507
  datahub/ingestion/source/sql/vertica.py,sha256=_9OgSgIgqBml0av063rb8nACiT3SAmzpw0ouyF91wv8,33382
506
508
  datahub/ingestion/source/sql/mssql/__init__.py,sha256=1agpl8S_uDW40olkhCX_W19dbr5GO9qgjS3R7pLRZSk,87
507
509
  datahub/ingestion/source/sql/mssql/job_models.py,sha256=nAo3rciu-w2-dXCz6_ekDEbGMEjCMEfh8WvSfXoF2l0,9359
508
- datahub/ingestion/source/sql/mssql/source.py,sha256=BDkeJV64K_IA8a5t4emviYc9tgphkx1GMAp2gGPS60M,34230
510
+ datahub/ingestion/source/sql/mssql/source.py,sha256=gMv7myHlhR9ja2YsLjt_hyeuoj1uOjtq3jmQkOtJz_E,42611
509
511
  datahub/ingestion/source/sql/stored_procedures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
510
512
  datahub/ingestion/source/sql/stored_procedures/base.py,sha256=n0l5OaTuW-m3TRvkxs3TqvgMeWF6BagzW3tjyWUcC1A,8631
511
513
  datahub/ingestion/source/sql/stored_procedures/lineage.py,sha256=fryLhuAlsjr9SHIjHJ-PmtCMx89bjzWVnJZ3f1bwQVU,1905
@@ -540,7 +542,7 @@ datahub/ingestion/source/unity/proxy.py,sha256=E8ZhWIY3j7gjEz8ttWOeHlom0jCMJXkWH
540
542
  datahub/ingestion/source/unity/proxy_profiling.py,sha256=WLqvYP6MziaisA4LYL4T_GA-kPt6Xdde7bfaYsjYw40,9663
541
543
  datahub/ingestion/source/unity/proxy_types.py,sha256=qrvHiwPzl5cPX-KRvcIGGeJVdr0I8XUQmoAI6ErZ-v8,9371
542
544
  datahub/ingestion/source/unity/report.py,sha256=XFT9oQfvEB4RkTvWGgFOoQuLPUN_AIoPXZ79xeDhGHQ,2831
543
- datahub/ingestion/source/unity/source.py,sha256=kRWdt_vTveAB8ADQHsRQySQMYP_G0kTaEi17hm-brF8,49018
545
+ datahub/ingestion/source/unity/source.py,sha256=C3mtTx_7R5TixxOv1EZtszzLww4i_o0CPFeSk4JNebQ,48959
544
546
  datahub/ingestion/source/unity/tag_entities.py,sha256=iWl6nRAWSye1hoFDx_Xh4aT53PN0sGzlX7n1-oTVUv8,11568
545
547
  datahub/ingestion/source/unity/usage.py,sha256=0wETBAaZvHI_EGgBlxX3bKsVHEAdnUV8_bKI_lbyWjY,11500
546
548
  datahub/ingestion/source/usage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -604,12 +606,12 @@ datahub/lite/lite_registry.py,sha256=bpH0kasP-LtwwUFNA2QsOIehfekAYfJtN-AkQLmSWnw
604
606
  datahub/lite/lite_server.py,sha256=p9Oa2nNs65mqcssSIVOr7VOzWqfVstz6ZQEdT4f82S0,1949
605
607
  datahub/lite/lite_util.py,sha256=G0LQHKkyEb1pc_q183g6hflShclGx7kikgMaOxtVVcs,4545
606
608
  datahub/metadata/__init__.py,sha256=AjhXPjI6cnpdcrBRrE5gOWo15vv2TTl2ctU4UAnUN7A,238
607
- datahub/metadata/_internal_schema_classes.py,sha256=r4Cmjp3i27s5ab8f2YyaaBt0NfTHd47Ujet_iE4V57w,1018092
608
- datahub/metadata/schema.avsc,sha256=rLO4g_-N-yOByWzSba-IyesZ6Uft8kHDDuHgm92ktjE,768904
609
+ datahub/metadata/_internal_schema_classes.py,sha256=o3pZiN2dkOTpOgSAqFBFclbhpegpQJ-s8xQLFcmi2uk,1018092
610
+ datahub/metadata/schema.avsc,sha256=77v5U9zCJnTt2FaWZ8tUVsbUD8WuTZhoLDfkzlW6APk,706092
609
611
  datahub/metadata/schema_classes.py,sha256=tPT8iHCak4IsZi_oL0nirbPpI8ETTPTZzapqLRpeKU4,1326
610
612
  datahub/metadata/urns.py,sha256=nfrCTExR-k2P9w272WVtWSN3xW1VUJngPwP3xnvULjU,1217
611
613
  datahub/metadata/_urns/__init__.py,sha256=cOF3GHMDgPhmbLKbN02NPpuLGHSu0qNgQyBRv08eqF0,243
612
- datahub/metadata/_urns/urn_defs.py,sha256=VvKTBOMcyVthp6oy4Bnu5uxcGGGfptBgbUiboHbnX_c,138516
614
+ datahub/metadata/_urns/urn_defs.py,sha256=yhU7EP7gJGBoO1EmePqnmWxWhkPx7Q_WzDTUyfpXsus,138516
613
615
  datahub/metadata/com/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
614
616
  datahub/metadata/com/linkedin/__init__.py,sha256=gsAIuTxzfJdI7a9ybZlgMIHMAYksM1SxGxXjtySgKSc,202
615
617
  datahub/metadata/com/linkedin/events/__init__.py,sha256=s_dR0plZF-rOxxIbE8ojekJqwiHzl2WYR-Z3kW6kKS0,298
@@ -910,7 +912,7 @@ datahub/metadata/schemas/VersionProperties.avsc,sha256=ME8V01JzG8lEsLXgYWnSYCehm
910
912
  datahub/metadata/schemas/VersionSetKey.avsc,sha256=psjGNNcFua3Zs9Xlh4HnUHNmBEU74uYdJR5g20NhRJU,659
911
913
  datahub/metadata/schemas/VersionSetProperties.avsc,sha256=fxNxEMxGdUDi_-T0sd6KJks5BWEo5AzboQxpZYKLbiQ,1434
912
914
  datahub/metadata/schemas/ViewProperties.avsc,sha256=3HhcbH5493dJUnEUtFMYMVfbYQ52aDedm5L4j77Nym4,1032
913
- datahub/metadata/schemas/__init__.py,sha256=kCcak_fBn_KyuysZTJIoipAzZ8EO44Amk4DWSEvplEY,581
915
+ datahub/metadata/schemas/__init__.py,sha256=uvLNC3VyCkWA_v8e9FdA1leFf46NFKDD0AajCfihepI,581
914
916
  datahub/pydantic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
915
917
  datahub/pydantic/compat.py,sha256=TUEo4kSEeOWVAhV6LQtst1phrpVgGtK4uif4OI5vQ2M,1937
916
918
  datahub/sdk/__init__.py,sha256=66OOcFi7qlnL6q72c_yUX2mWU2HudbOdRsC5CIoDxow,1922
@@ -927,7 +929,7 @@ datahub/sdk/dataset.py,sha256=2-iD-HqjgFpCBmU3k8O5tkltmwFj4jaumADiX8sexJU,29465
927
929
  datahub/sdk/entity.py,sha256=Q29AbpS58L4gD8ETwoNIwG-ouytz4c0MSSFi6-jLl_4,6742
928
930
  datahub/sdk/entity_client.py,sha256=xHLGLn6oJfxmHLXo5w4-isPFZGcf8yR5IwyC6pvl_I8,8903
929
931
  datahub/sdk/lineage_client.py,sha256=u4bzs6xpdzWhZGx-V0rj1tvQxesVSEuxvxjRQRhZMSg,33822
930
- datahub/sdk/main_client.py,sha256=4P8ot6od5GLu93tiWJ4W1adcsVH6J1xeew5nyBe7rGw,5161
932
+ datahub/sdk/main_client.py,sha256=nB9CsQxq7fgW7zXtDwSgu51V2OGT12O1zaYZv9oR2t0,5137
931
933
  datahub/sdk/mlmodel.py,sha256=cO5R8BYVljmQ0w33RIOuZmj4nq8OJCDVAZGTQI6YFS8,12628
932
934
  datahub/sdk/mlmodelgroup.py,sha256=wlZZHny0UORpF0fRYuVkWLSQwIHX_fWl5lPb1NKR6dM,8194
933
935
  datahub/sdk/resolver_client.py,sha256=nKMAZJt2tRSGfKSzoREIh43PXqjM3umLiYkYHJjo1io,3243
@@ -1071,8 +1073,8 @@ datahub_provider/operators/datahub_assertion_operator.py,sha256=uvTQ-jk2F0sbqqxp
1071
1073
  datahub_provider/operators/datahub_assertion_sensor.py,sha256=lCBj_3x1cf5GMNpHdfkpHuyHfVxsm6ff5x2Z5iizcAo,140
1072
1074
  datahub_provider/operators/datahub_operation_operator.py,sha256=aevDp2FzX7FxGlXrR0khoHNbxbhKR2qPEX5e8O2Jyzw,174
1073
1075
  datahub_provider/operators/datahub_operation_sensor.py,sha256=8fcdVBCEPgqy1etTXgLoiHoJrRt_nzFZQMdSzHqSG7M,168
1074
- acryl_datahub-1.1.0.1.dist-info/METADATA,sha256=KA0pyd75V_sitXqm5QBpSUGuUZREBHcXDFGOCOyVpo0,180691
1075
- acryl_datahub-1.1.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1076
- acryl_datahub-1.1.0.1.dist-info/entry_points.txt,sha256=o3mDeJXSKhsy7XLkuogihraiabBdLn9HaizYXPrxmk0,9710
1077
- acryl_datahub-1.1.0.1.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
1078
- acryl_datahub-1.1.0.1.dist-info/RECORD,,
1076
+ acryl_datahub-1.1.0.2rc1.dist-info/METADATA,sha256=SztUJwVSty1c3J3bokL--2m9i0SyP1Q_ayGeXT0kMCA,180763
1077
+ acryl_datahub-1.1.0.2rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1078
+ acryl_datahub-1.1.0.2rc1.dist-info/entry_points.txt,sha256=o3mDeJXSKhsy7XLkuogihraiabBdLn9HaizYXPrxmk0,9710
1079
+ acryl_datahub-1.1.0.2rc1.dist-info/top_level.txt,sha256=iLjSrLK5ox1YVYcglRUkcvfZPvKlobBWx7CTUXx8_GI,25
1080
+ acryl_datahub-1.1.0.2rc1.dist-info/RECORD,,
datahub/_version.py CHANGED
@@ -1,6 +1,6 @@
1
1
  # Published at https://pypi.org/project/acryl-datahub/.
2
2
  __package_name__ = "acryl-datahub"
3
- __version__ = "1.1.0.1"
3
+ __version__ = "1.1.0.2rc1"
4
4
 
5
5
 
6
6
  def is_dev_mode() -> bool:
@@ -0,0 +1,161 @@
1
+ # Import RestrictedText from your existing module
2
+ # Uncomment and adjust the import path as needed:
3
+ # from your_restricted_text_module import RestrictedText
4
+ # The following is a list of tag constraints:
5
+ # You can assign a maximum of 50 tags to a single securable object.
6
+ # The maximum length of a tag key is 255 characters.
7
+ # The maximum length of a tag value is 1000 characters.
8
+ # The following characters are not allowed in tag keys:
9
+ # . , - = / :
10
+ # Tag search using the workspace search UI is supported only for tables, views, and table columns.
11
+ # Tag search requires exact term matching.
12
+ # https://learn.microsoft.com/en-us/azure/databricks/database-objects/tags#constraint
13
+ from typing import Any, Dict, Optional, Union
14
+
15
+ from typing_extensions import ClassVar
16
+
17
+ from datahub.api.entities.external.external_tag import ExternalTag
18
+ from datahub.api.entities.external.restricted_text import RestrictedText
19
+
20
+
21
+ class LakeFormationTagKeyText(RestrictedText):
22
+ """RestrictedText configured for Unity Catalog tag keys."""
23
+
24
+ _default_max_length: ClassVar[int] = 50
25
+ # Unity Catalog tag keys: alphanumeric, hyphens, underscores, periods only
26
+ _default_replacement_char: ClassVar[str] = "_"
27
+ _default_truncation_suffix: ClassVar[str] = "" # No suffix for clean identifiers
28
+
29
+
30
+ class LakeFormationTagValueText(RestrictedText):
31
+ """RestrictedText configured for Unity Catalog tag values."""
32
+
33
+ _default_max_length: ClassVar[int] = 50
34
+ # Unity Catalog tag values are more permissive but still have some restrictions
35
+ _default_replacement_char: ClassVar[str] = " "
36
+ _default_truncation_suffix: ClassVar[str] = "..."
37
+
38
+
39
+ class LakeFormationTag(ExternalTag):
40
+ """
41
+ A tag type specifically designed for LakeFormation tag restrictions.
42
+
43
+ LakeFormation Tag Restrictions:
44
+ - Key: Max 127 characters, alphanumeric + hyphens, underscores, periods only
45
+ - Value: Max 256 characters, more permissive but no control characters
46
+ """
47
+
48
+ key: LakeFormationTagKeyText
49
+ value: Optional[LakeFormationTagValueText] = None
50
+ catalog: Optional[str] = None
51
+
52
+ def __init__(
53
+ self,
54
+ key: Optional[Union[str, LakeFormationTagKeyText]] = None,
55
+ value: Optional[Union[str, LakeFormationTagValueText]] = None,
56
+ **data: Any,
57
+ ) -> None:
58
+ """
59
+ Initialize LakeFormation Tag from either a DataHub Tag URN or explicit key/value.
60
+
61
+ Args:
62
+ key: Explicit key value (optional for Pydantic initialization)
63
+ value: Explicit value (optional)
64
+ **data: Additional Pydantic data
65
+ """
66
+ if key is not None:
67
+ # Direct initialization with key/value
68
+ processed_key = (
69
+ LakeFormationTagKeyText(key)
70
+ if not isinstance(key, LakeFormationTagKeyText)
71
+ else key
72
+ )
73
+ processed_value = None
74
+ if value is not None:
75
+ processed_value = (
76
+ LakeFormationTagValueText(value)
77
+ if not isinstance(value, LakeFormationTagValueText)
78
+ else value
79
+ )
80
+
81
+ super().__init__(
82
+ key=processed_key,
83
+ value=processed_value,
84
+ **data,
85
+ )
86
+ else:
87
+ # Standard pydantic initialization
88
+ super().__init__(**data)
89
+
90
+ def __eq__(self, other: object) -> bool:
91
+ """Check equality based on key and value."""
92
+ if not isinstance(other, LakeFormationTag):
93
+ return False
94
+ return str(self.key) == str(other.key) and (
95
+ str(self.value) if self.value else None
96
+ ) == (str(other.value) if other.value else None)
97
+
98
+ def __hash__(self) -> int:
99
+ """Make LakeFormationTag hashable based on key and value."""
100
+ return hash((str(self.key), str(self.value) if self.value else None))
101
+
102
+ @classmethod
103
+ def from_dict(cls, tag_dict: Dict[str, Any]) -> "LakeFormationTag":
104
+ """
105
+ Create a LakeFormationTag from a dictionary with 'key' and optional 'value'.
106
+
107
+ Args:
108
+ tag_dict: Dictionary with 'key' and optional 'value' keys
109
+
110
+ Returns:
111
+ LakeFormationTag instance
112
+ """
113
+ return cls(key=tag_dict["key"], value=tag_dict.get("value"))
114
+
115
+ @classmethod
116
+ def from_key_value(
117
+ cls, key: str, value: Optional[str] = None
118
+ ) -> "LakeFormationTag":
119
+ """
120
+ Create a LakeFormationTagPlatformResource from explicit key and value.
121
+
122
+ Overrides the parent method to return the correct type.
123
+
124
+ Args:
125
+ key: Tag key
126
+ value: Optional tag value
127
+
128
+ Returns:
129
+ LakeFormationTag instance
130
+ """
131
+ return cls(key=key, value=value)
132
+
133
+ def to_dict(self) -> Dict[str, str]:
134
+ """
135
+ Convert to dictionary format suitable for LakeFormation tag.
136
+
137
+ Returns:
138
+ Dictionary with 'key' and optionally 'value'
139
+ """
140
+ result: Dict[str, str] = {"key": self.key.original}
141
+ if self.value is not None:
142
+ result["value"] = self.value.original
143
+ return result
144
+
145
+ def to_display_dict(self) -> Dict[str, str]:
146
+ """
147
+ Convert to dictionary format showing processed values.
148
+
149
+ Returns:
150
+ Dictionary with processed 'key' and optional 'value'
151
+ """
152
+ result: Dict[str, str] = {"key": str(self.key)}
153
+ if self.value is not None:
154
+ result["value"] = str(self.value)
155
+ return result
156
+
157
+ def __repr__(self) -> str:
158
+ if self.value:
159
+ return f"LakeFormationTag(key={self.key!r}, value={self.value!r})"
160
+ else:
161
+ return f"LakeFormationTag(key={self.key!r})"
@@ -35,12 +35,12 @@ class RestrictedTextConfig:
35
35
  def __init__(
36
36
  self,
37
37
  max_length: Optional[int] = None,
38
- replace_chars: Optional[Set[str]] = None,
38
+ forbidden_chars: Optional[Set[str]] = None,
39
39
  replacement_char: Optional[str] = None,
40
40
  truncation_suffix: Optional[str] = None,
41
41
  ):
42
42
  self.max_length = max_length
43
- self.replace_chars = replace_chars
43
+ self.forbidden_chars = forbidden_chars
44
44
  self.replacement_char = replacement_char
45
45
  self.truncation_suffix = truncation_suffix
46
46
 
@@ -81,7 +81,7 @@ class RestrictedText(str):
81
81
 
82
82
  # Default configuration
83
83
  _default_max_length: ClassVar[Optional[int]] = 50
84
- _default_replace_chars: ClassVar[Set[str]] = {" ", "\t", "\n", "\r"}
84
+ _default_forbidden_chars: ClassVar[Set[str]] = {" ", "\t", "\n", "\r"}
85
85
  _default_replacement_char: ClassVar[str] = "_"
86
86
  _default_truncation_suffix: ClassVar[str] = "..."
87
87
 
@@ -94,7 +94,7 @@ class RestrictedText(str):
94
94
  """Initialize the RestrictedText with a value."""
95
95
  self.original: str = value
96
96
  self.max_length = self._default_max_length
97
- self.replace_chars = self._default_replace_chars
97
+ self.forbidden_chars = self._default_forbidden_chars
98
98
  self.replacement_char = self._default_replacement_char
99
99
  self.truncation_suffix = self._default_truncation_suffix
100
100
 
@@ -104,15 +104,15 @@ class RestrictedText(str):
104
104
  def _configure(
105
105
  self,
106
106
  max_length: Optional[int] = None,
107
- replace_chars: Optional[Set[str]] = None,
107
+ forbidden_chars: Optional[Set[str]] = None,
108
108
  replacement_char: Optional[str] = None,
109
109
  truncation_suffix: Optional[str] = None,
110
110
  ) -> "RestrictedText":
111
111
  """Configure this instance with custom settings."""
112
112
  if max_length is not None:
113
113
  self.max_length = max_length
114
- if replace_chars is not None:
115
- self.replace_chars = replace_chars
114
+ if forbidden_chars is not None:
115
+ self.forbidden_chars = forbidden_chars
116
116
  if replacement_char is not None:
117
117
  self.replacement_char = replacement_char
118
118
  if truncation_suffix is not None:
@@ -126,7 +126,7 @@ class RestrictedText(str):
126
126
  """Process the value by replacing characters and truncating."""
127
127
  # Replace specified characters
128
128
  processed = value
129
- for char in self.replace_chars:
129
+ for char in self.forbidden_chars:
130
130
  processed = processed.replace(char, self.replacement_char)
131
131
 
132
132
  # Truncate if necessary
@@ -174,7 +174,7 @@ class RestrictedText(str):
174
174
  """
175
175
  return RestrictedTextConfig(
176
176
  max_length=max_length,
177
- replace_chars=forbidden_chars,
177
+ forbidden_chars=forbidden_chars,
178
178
  replacement_char=replacement_char,
179
179
  truncation_suffix=truncation_suffix,
180
180
  )
@@ -234,7 +234,7 @@ class RestrictedText(str):
234
234
  config = field.default
235
235
  instance._configure(
236
236
  max_length=config.max_length,
237
- replace_chars=config.replace_chars,
237
+ forbidden_chars=config.forbidden_chars,
238
238
  replacement_char=config.replacement_char,
239
239
  truncation_suffix=config.truncation_suffix,
240
240
  )
@@ -23,7 +23,7 @@ class UnityCatalogTagKeyText(RestrictedText):
23
23
 
24
24
  _default_max_length: ClassVar[int] = 255
25
25
  # Unity Catalog tag keys: alphanumeric, hyphens, underscores, periods only
26
- _default_replace_chars: ClassVar[Set[str]] = {
26
+ _default_forbidden_chars: ClassVar[Set[str]] = {
27
27
  "\t",
28
28
  "\n",
29
29
  "\r",
@@ -43,7 +43,7 @@ class UnityCatalogTagValueText(RestrictedText):
43
43
 
44
44
  _default_max_length: ClassVar[int] = 1000
45
45
  # Unity Catalog tag values are more permissive but still have some restrictions
46
- _default_replace_chars: ClassVar[Set[str]] = {"\t", "\n", "\r"}
46
+ _default_forbidden_chars: ClassVar[Set[str]] = {"\t", "\n", "\r"}
47
47
  _default_replacement_char: ClassVar[str] = " "
48
48
  _default_truncation_suffix: ClassVar[str] = "..."
49
49
 
@@ -88,6 +88,9 @@ class UnityCatalogTag(ExternalTag):
88
88
  if not isinstance(value, UnityCatalogTagValueText)
89
89
  else value
90
90
  )
91
+ # If value is an empty string, set it to None to not generater empty value in DataHub tag which results in key: tags
92
+ if not str(value):
93
+ processed_value = None
91
94
 
92
95
  super().__init__(
93
96
  key=processed_key,
@@ -314,6 +314,7 @@ class DataHubRestEmitter(Closeable, Emitter):
314
314
  openapi_ingestion: Optional[bool] = None,
315
315
  client_mode: Optional[ClientMode] = None,
316
316
  datahub_component: Optional[str] = None,
317
+ server_config_refresh_interval: Optional[int] = None,
317
318
  ):
318
319
  if not gms_server:
319
320
  raise ConfigurationError("gms server is required")
@@ -329,6 +330,8 @@ class DataHubRestEmitter(Closeable, Emitter):
329
330
  self._openapi_ingestion = (
330
331
  openapi_ingestion # Re-evaluated after test connection
331
332
  )
333
+ self._server_config_refresh_interval = server_config_refresh_interval
334
+ self._config_fetch_time: Optional[float] = None
332
335
 
333
336
  headers = {
334
337
  "X-RestLi-Protocol-Version": "2.0.0",
@@ -398,7 +401,17 @@ class DataHubRestEmitter(Closeable, Emitter):
398
401
  Raises:
399
402
  ConfigurationError: If there's an error fetching or validating the configuration
400
403
  """
401
- if not hasattr(self, "_server_config") or not self._server_config:
404
+
405
+ if (
406
+ not hasattr(self, "_server_config")
407
+ or self._server_config is None
408
+ or (
409
+ self._server_config_refresh_interval is not None
410
+ and self._config_fetch_time is not None
411
+ and (time.time() - self._config_fetch_time)
412
+ > self._server_config_refresh_interval
413
+ )
414
+ ):
402
415
  if self._session is None or self._gms_server is None:
403
416
  raise ConfigurationError(
404
417
  "Session and URL are required to load configuration"
@@ -419,6 +432,7 @@ class DataHubRestEmitter(Closeable, Emitter):
419
432
  )
420
433
 
421
434
  self._server_config = RestServiceConfig(raw_config=raw_config)
435
+ self._config_fetch_time = time.time()
422
436
  self._post_fetch_server_config()
423
437
 
424
438
  else:
@@ -453,6 +467,8 @@ class DataHubRestEmitter(Closeable, Emitter):
453
467
  DEFAULT_REST_EMITTER_ENDPOINT == RestSinkEndpoint.OPENAPI
454
468
  )
455
469
 
470
+ def test_connection(self) -> None:
471
+ self.fetch_server_config()
456
472
  logger.debug(
457
473
  f"Using {'OpenAPI' if self._openapi_ingestion else 'Restli'} for ingestion."
458
474
  )
@@ -460,12 +476,21 @@ class DataHubRestEmitter(Closeable, Emitter):
460
476
  f"{EmitMode.ASYNC_WAIT} {'IS' if self._should_trace(emit_mode=EmitMode.ASYNC_WAIT, warn=False) else 'IS NOT'} supported."
461
477
  )
462
478
 
463
- def test_connection(self) -> None:
464
- self.fetch_server_config()
465
-
466
479
  def get_server_config(self) -> dict:
467
480
  return self.server_config.raw_config
468
481
 
482
+ def invalidate_config_cache(self) -> None:
483
+ """Manually invalidate the configuration cache."""
484
+ if (
485
+ hasattr(self, "_server_config")
486
+ and self._server_config is not None
487
+ and self._server_config_refresh_interval is not None
488
+ ):
489
+ # Set fetch time to beyond TTL in the past to force refresh on next access
490
+ self._config_fetch_time = (
491
+ time.time() - self._server_config_refresh_interval - 1
492
+ )
493
+
469
494
  def to_graph(self) -> "DataHubGraph":
470
495
  from datahub.ingestion.graph.client import DataHubGraph
471
496
 
@@ -159,6 +159,7 @@ class DataHubGraph(DatahubRestEmitter, EntityVersioningAPI):
159
159
  openapi_ingestion=self.config.openapi_ingestion,
160
160
  client_mode=config.client_mode,
161
161
  datahub_component=config.datahub_component,
162
+ server_config_refresh_interval=config.server_config_refresh_interval,
162
163
  )
163
164
  self.server_id: str = _MISSING_SERVER_ID
164
165
 
@@ -234,6 +235,7 @@ class DataHubGraph(DatahubRestEmitter, EntityVersioningAPI):
234
235
  client_certificate_path=session_config.client_certificate_path,
235
236
  client_mode=session_config.client_mode,
236
237
  datahub_component=session_config.datahub_component,
238
+ server_config_refresh_interval=emitter._server_config_refresh_interval,
237
239
  )
238
240
  )
239
241
 
@@ -29,6 +29,7 @@ class DatahubClientConfig(ConfigModel):
29
29
  openapi_ingestion: Optional[bool] = None
30
30
  client_mode: Optional[ClientMode] = None
31
31
  datahub_component: Optional[str] = None
32
+ server_config_refresh_interval: Optional[int] = None
32
33
 
33
34
  class Config:
34
35
  extra = "ignore"
@@ -13,6 +13,7 @@ from datahub.configuration.common import (
13
13
  from datahub.emitter.aspect import JSON_CONTENT_TYPE
14
14
  from datahub.emitter.mce_builder import datahub_guid, make_data_platform_urn
15
15
  from datahub.emitter.mcp import MetadataChangeProposalWrapper
16
+ from datahub.emitter.rest_emitter import EmitMode
16
17
  from datahub.ingestion.api.common import PipelineContext, RecordEnvelope
17
18
  from datahub.ingestion.api.pipeline_run_listener import PipelineRunListener
18
19
  from datahub.ingestion.api.sink import NoopWriteCallback, Sink
@@ -111,6 +112,7 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
111
112
  def __init__(self, sink: Sink, report_recipe: bool, ctx: PipelineContext) -> None:
112
113
  assert ctx.pipeline_config is not None
113
114
 
115
+ self.ctx = ctx
114
116
  self.sink: Sink = sink
115
117
  self.report_recipe = report_recipe
116
118
  ingestion_source_key = self.generate_unique_key(ctx.pipeline_config)
@@ -191,18 +193,25 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
191
193
  )
192
194
  return json.dumps(converted_recipe)
193
195
 
194
- def _emit_aspect(self, entity_urn: Urn, aspect_value: _Aspect) -> None:
195
- self.sink.write_record_async(
196
- RecordEnvelope(
197
- record=MetadataChangeProposalWrapper(
198
- entityUrn=str(entity_urn),
199
- aspect=aspect_value,
200
- ),
201
- metadata={},
202
- ),
203
- NoopWriteCallback(),
196
+ def _emit_aspect(
197
+ self, entity_urn: Urn, aspect_value: _Aspect, try_sync: bool = False
198
+ ) -> None:
199
+ mcp = MetadataChangeProposalWrapper(
200
+ entityUrn=str(entity_urn),
201
+ aspect=aspect_value,
204
202
  )
205
203
 
204
+ if try_sync and self.ctx.graph:
205
+ self.ctx.graph.emit_mcp(mcp, emit_mode=EmitMode.SYNC_PRIMARY)
206
+ else:
207
+ self.sink.write_record_async(
208
+ RecordEnvelope(
209
+ record=mcp,
210
+ metadata={},
211
+ ),
212
+ NoopWriteCallback(),
213
+ )
214
+
206
215
  def on_start(self, ctx: PipelineContext) -> None:
207
216
  assert ctx.pipeline_config is not None
208
217
  # Construct the dataHubExecutionRequestInput aspect
@@ -223,6 +232,7 @@ class DatahubIngestionRunSummaryProvider(PipelineRunListener):
223
232
  self._emit_aspect(
224
233
  entity_urn=self.execution_request_input_urn,
225
234
  aspect_value=execution_input_aspect,
235
+ try_sync=True,
226
236
  )
227
237
 
228
238
  def on_completion(
@@ -70,6 +70,7 @@ _DEFAULT_REST_SINK_MODE = pydantic.parse_obj_as(
70
70
  class DatahubRestSinkConfig(DatahubClientConfig):
71
71
  mode: RestSinkMode = _DEFAULT_REST_SINK_MODE
72
72
  endpoint: RestSinkEndpoint = DEFAULT_REST_EMITTER_ENDPOINT
73
+ server_config_refresh_interval: Optional[int] = None
73
74
 
74
75
  # These only apply in async modes.
75
76
  max_threads: pydantic.PositiveInt = _DEFAULT_REST_SINK_MAX_THREADS
@@ -24,6 +24,7 @@ logger = logging.getLogger(__name__)
24
24
  if TYPE_CHECKING:
25
25
  from mypy_boto3_dynamodb import DynamoDBClient
26
26
  from mypy_boto3_glue import GlueClient
27
+ from mypy_boto3_lakeformation import LakeFormationClient
27
28
  from mypy_boto3_s3 import S3Client, S3ServiceResource
28
29
  from mypy_boto3_sagemaker import SageMakerClient
29
30
  from mypy_boto3_sts import STSClient
@@ -454,6 +455,9 @@ class AwsConnectionConfig(ConfigModel):
454
455
  def get_sagemaker_client(self) -> "SageMakerClient":
455
456
  return self.get_session().client("sagemaker", config=self._aws_config())
456
457
 
458
+ def get_lakeformation_client(self) -> "LakeFormationClient":
459
+ return self.get_session().client("lakeformation", config=self._aws_config())
460
+
457
461
 
458
462
  class AwsSourceConfig(EnvConfigMixin, AwsConnectionConfig):
459
463
  """