acryl-datahub 1.2.0.10rc2__py3-none-any.whl → 1.2.0.10rc4__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.
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/METADATA +2525 -2609
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/RECORD +93 -93
- datahub/_version.py +1 -1
- datahub/api/entities/assertion/assertion.py +1 -1
- datahub/api/entities/corpgroup/corpgroup.py +1 -1
- datahub/api/entities/dataproduct/dataproduct.py +6 -3
- datahub/api/entities/dataset/dataset.py +9 -18
- datahub/api/entities/structuredproperties/structuredproperties.py +2 -2
- datahub/api/graphql/operation.py +10 -6
- datahub/cli/docker_check.py +2 -2
- datahub/configuration/common.py +29 -1
- datahub/configuration/connection_resolver.py +5 -2
- datahub/configuration/import_resolver.py +7 -4
- datahub/configuration/pydantic_migration_helpers.py +0 -9
- datahub/configuration/source_common.py +3 -2
- datahub/configuration/validate_field_deprecation.py +5 -2
- datahub/configuration/validate_field_removal.py +5 -2
- datahub/configuration/validate_field_rename.py +6 -5
- datahub/configuration/validate_multiline_string.py +5 -2
- datahub/ingestion/run/pipeline_config.py +2 -2
- datahub/ingestion/source/azure/azure_common.py +1 -1
- datahub/ingestion/source/bigquery_v2/bigquery_config.py +28 -14
- datahub/ingestion/source/bigquery_v2/queries_extractor.py +4 -5
- datahub/ingestion/source/common/gcp_credentials_config.py +3 -1
- datahub/ingestion/source/data_lake_common/path_spec.py +16 -16
- datahub/ingestion/source/datahub/config.py +8 -9
- datahub/ingestion/source/delta_lake/config.py +1 -1
- datahub/ingestion/source/dremio/dremio_config.py +3 -4
- datahub/ingestion/source/feast.py +8 -10
- datahub/ingestion/source/fivetran/config.py +1 -1
- datahub/ingestion/source/ge_profiling_config.py +26 -22
- datahub/ingestion/source/grafana/grafana_config.py +2 -2
- datahub/ingestion/source/grafana/models.py +12 -14
- datahub/ingestion/source/hex/hex.py +6 -1
- datahub/ingestion/source/iceberg/iceberg_profiler.py +4 -2
- datahub/ingestion/source/kafka_connect/common.py +2 -2
- datahub/ingestion/source/looker/looker_common.py +55 -75
- datahub/ingestion/source/looker/looker_config.py +15 -4
- datahub/ingestion/source/looker/looker_source.py +445 -548
- datahub/ingestion/source/looker/lookml_config.py +1 -1
- datahub/ingestion/source/metadata/business_glossary.py +7 -7
- datahub/ingestion/source/metadata/lineage.py +1 -1
- datahub/ingestion/source/mode.py +13 -5
- datahub/ingestion/source/nifi.py +1 -1
- datahub/ingestion/source/powerbi/config.py +14 -21
- datahub/ingestion/source/preset.py +1 -1
- datahub/ingestion/source/qlik_sense/data_classes.py +28 -8
- datahub/ingestion/source/redshift/config.py +6 -3
- datahub/ingestion/source/salesforce.py +13 -9
- datahub/ingestion/source/schema/json_schema.py +14 -14
- datahub/ingestion/source/sigma/data_classes.py +3 -0
- datahub/ingestion/source/snowflake/snowflake_config.py +12 -15
- datahub/ingestion/source/snowflake/snowflake_connection.py +8 -3
- datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +15 -2
- datahub/ingestion/source/snowflake/snowflake_queries.py +4 -5
- datahub/ingestion/source/sql/athena.py +2 -1
- datahub/ingestion/source/sql/clickhouse.py +12 -7
- datahub/ingestion/source/sql/cockroachdb.py +5 -3
- datahub/ingestion/source/sql/druid.py +2 -2
- datahub/ingestion/source/sql/hive.py +4 -3
- datahub/ingestion/source/sql/hive_metastore.py +7 -9
- datahub/ingestion/source/sql/mssql/source.py +2 -2
- datahub/ingestion/source/sql/mysql.py +2 -2
- datahub/ingestion/source/sql/oracle.py +3 -3
- datahub/ingestion/source/sql/presto.py +2 -1
- datahub/ingestion/source/sql/teradata.py +4 -4
- datahub/ingestion/source/sql/trino.py +2 -1
- datahub/ingestion/source/sql/two_tier_sql_source.py +2 -3
- datahub/ingestion/source/sql/vertica.py +1 -1
- datahub/ingestion/source/sql_queries.py +6 -6
- datahub/ingestion/source/state/checkpoint.py +5 -1
- datahub/ingestion/source/state/entity_removal_state.py +5 -2
- datahub/ingestion/source/state/stateful_ingestion_base.py +5 -8
- datahub/ingestion/source/superset.py +29 -4
- datahub/ingestion/source/tableau/tableau.py +65 -11
- datahub/ingestion/source/tableau/tableau_common.py +5 -0
- datahub/ingestion/source/tableau/tableau_constant.py +1 -0
- datahub/ingestion/source/tableau/tableau_server_wrapper.py +3 -0
- datahub/ingestion/source/unity/config.py +7 -3
- datahub/ingestion/source/usage/usage_common.py +3 -3
- datahub/ingestion/source_config/pulsar.py +3 -1
- datahub/metadata/_internal_schema_classes.py +45 -1
- datahub/metadata/com/linkedin/pegasus2avro/common/__init__.py +2 -0
- datahub/metadata/schema.avsc +24 -1
- datahub/metadata/schemas/InstitutionalMemory.avsc +22 -0
- datahub/metadata/schemas/MLModelGroupKey.avsc +2 -1
- datahub/metadata/schemas/MetadataChangeEvent.avsc +22 -0
- datahub/sdk/dashboard.py +0 -2
- datahub/sdk/search_filters.py +1 -7
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/WHEEL +0 -0
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/entry_points.txt +0 -0
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/licenses/LICENSE +0 -0
- {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/top_level.txt +0 -0
|
@@ -3,6 +3,7 @@ import logging
|
|
|
3
3
|
import re
|
|
4
4
|
import time
|
|
5
5
|
from collections import OrderedDict, defaultdict
|
|
6
|
+
from copy import deepcopy
|
|
6
7
|
from dataclasses import dataclass, field as dataclass_field
|
|
7
8
|
from datetime import datetime, timedelta, timezone
|
|
8
9
|
from functools import lru_cache
|
|
@@ -474,6 +475,13 @@ class TableauPageSizeConfig(ConfigModel):
|
|
|
474
475
|
return self.database_table_page_size or self.page_size
|
|
475
476
|
|
|
476
477
|
|
|
478
|
+
_IngestHiddenAssetsOptionsType = Literal["worksheet", "dashboard"]
|
|
479
|
+
_IngestHiddenAssetsOptions: List[_IngestHiddenAssetsOptionsType] = [
|
|
480
|
+
"worksheet",
|
|
481
|
+
"dashboard",
|
|
482
|
+
]
|
|
483
|
+
|
|
484
|
+
|
|
477
485
|
class TableauConfig(
|
|
478
486
|
DatasetLineageProviderConfigBase,
|
|
479
487
|
StatefulIngestionConfigBase,
|
|
@@ -524,6 +532,10 @@ class TableauConfig(
|
|
|
524
532
|
default=False,
|
|
525
533
|
description="Ingest Owner from source. This will override Owner info entered from UI",
|
|
526
534
|
)
|
|
535
|
+
use_email_as_username: bool = Field(
|
|
536
|
+
default=False,
|
|
537
|
+
description="Use email address instead of username for entity owners. Requires ingest_owner to be True.",
|
|
538
|
+
)
|
|
527
539
|
ingest_tables_external: bool = Field(
|
|
528
540
|
default=False,
|
|
529
541
|
description="Ingest details for tables external to (not embedded in) tableau as entities.",
|
|
@@ -621,8 +633,8 @@ class TableauConfig(
|
|
|
621
633
|
description="Configuration settings for ingesting Tableau groups and their capabilities as custom properties.",
|
|
622
634
|
)
|
|
623
635
|
|
|
624
|
-
ingest_hidden_assets: Union[List[
|
|
625
|
-
|
|
636
|
+
ingest_hidden_assets: Union[List[_IngestHiddenAssetsOptionsType], bool] = Field(
|
|
637
|
+
_IngestHiddenAssetsOptions,
|
|
626
638
|
description=(
|
|
627
639
|
"When enabled, hidden worksheets and dashboards are ingested into Datahub."
|
|
628
640
|
" If a dashboard or worksheet is hidden in Tableau the luid is blank."
|
|
@@ -644,6 +656,11 @@ class TableauConfig(
|
|
|
644
656
|
# pre = True because we want to take some decision before pydantic initialize the configuration to default values
|
|
645
657
|
@root_validator(pre=True)
|
|
646
658
|
def projects_backward_compatibility(cls, values: Dict) -> Dict:
|
|
659
|
+
# In-place update of the input dict would cause state contamination. This was discovered through test failures
|
|
660
|
+
# in test_hex.py where the same dict is reused.
|
|
661
|
+
# So a copy is performed first.
|
|
662
|
+
values = deepcopy(values)
|
|
663
|
+
|
|
647
664
|
projects = values.get("projects")
|
|
648
665
|
project_pattern = values.get("project_pattern")
|
|
649
666
|
project_path_pattern = values.get("project_path_pattern")
|
|
@@ -655,6 +672,7 @@ class TableauConfig(
|
|
|
655
672
|
values["project_pattern"] = AllowDenyPattern(
|
|
656
673
|
allow=[f"^{prj}$" for prj in projects]
|
|
657
674
|
)
|
|
675
|
+
values.pop("projects")
|
|
658
676
|
elif (project_pattern or project_path_pattern) and projects:
|
|
659
677
|
raise ValueError(
|
|
660
678
|
"projects is deprecated. Please use project_path_pattern only."
|
|
@@ -666,7 +684,7 @@ class TableauConfig(
|
|
|
666
684
|
|
|
667
685
|
return values
|
|
668
686
|
|
|
669
|
-
@root_validator()
|
|
687
|
+
@root_validator(skip_on_failure=True)
|
|
670
688
|
def validate_config_values(cls, values: Dict) -> Dict:
|
|
671
689
|
tags_for_hidden_assets = values.get("tags_for_hidden_assets")
|
|
672
690
|
ingest_tags = values.get("ingest_tags")
|
|
@@ -678,6 +696,14 @@ class TableauConfig(
|
|
|
678
696
|
raise ValueError(
|
|
679
697
|
"tags_for_hidden_assets is only allowed with ingest_tags enabled. Be aware that this will overwrite tags entered from the UI."
|
|
680
698
|
)
|
|
699
|
+
|
|
700
|
+
use_email_as_username = values.get("use_email_as_username")
|
|
701
|
+
ingest_owner = values.get("ingest_owner")
|
|
702
|
+
if use_email_as_username and not ingest_owner:
|
|
703
|
+
raise ValueError(
|
|
704
|
+
"use_email_as_username requires ingest_owner to be enabled."
|
|
705
|
+
)
|
|
706
|
+
|
|
681
707
|
return values
|
|
682
708
|
|
|
683
709
|
|
|
@@ -839,6 +865,9 @@ class TableauSourceReport(
|
|
|
839
865
|
default_factory=(lambda: defaultdict(int))
|
|
840
866
|
)
|
|
841
867
|
|
|
868
|
+
# Owner extraction statistics
|
|
869
|
+
num_email_fallback_to_username: int = 0
|
|
870
|
+
|
|
842
871
|
|
|
843
872
|
def report_user_role(report: TableauSourceReport, server: Server) -> None:
|
|
844
873
|
title: str = "Insufficient Permissions"
|
|
@@ -2716,13 +2745,12 @@ class TableauSiteSource:
|
|
|
2716
2745
|
dataset_snapshot.aspects.append(browse_paths)
|
|
2717
2746
|
|
|
2718
2747
|
# Ownership
|
|
2719
|
-
|
|
2720
|
-
self.
|
|
2721
|
-
if datasource_info
|
|
2722
|
-
and datasource_info.get(c.OWNER)
|
|
2723
|
-
and datasource_info[c.OWNER].get(c.USERNAME)
|
|
2748
|
+
owner_identifier = (
|
|
2749
|
+
self._get_owner_identifier(datasource_info[c.OWNER])
|
|
2750
|
+
if datasource_info and datasource_info.get(c.OWNER)
|
|
2724
2751
|
else None
|
|
2725
2752
|
)
|
|
2753
|
+
owner = self._get_ownership(owner_identifier) if owner_identifier else None
|
|
2726
2754
|
if owner is not None:
|
|
2727
2755
|
dataset_snapshot.aspects.append(owner)
|
|
2728
2756
|
|
|
@@ -3127,7 +3155,7 @@ class TableauSiteSource:
|
|
|
3127
3155
|
|
|
3128
3156
|
creator: Optional[str] = None
|
|
3129
3157
|
if workbook is not None and workbook.get(c.OWNER) is not None:
|
|
3130
|
-
creator = workbook[c.OWNER]
|
|
3158
|
+
creator = self._get_owner_identifier(workbook[c.OWNER])
|
|
3131
3159
|
created_at = sheet.get(c.CREATED_AT, datetime.now())
|
|
3132
3160
|
updated_at = sheet.get(c.UPDATED_AT, datetime.now())
|
|
3133
3161
|
last_modified = self.get_last_modified(creator, created_at, updated_at)
|
|
@@ -3276,7 +3304,7 @@ class TableauSiteSource:
|
|
|
3276
3304
|
|
|
3277
3305
|
def emit_workbook_as_container(self, workbook: Dict) -> Iterable[MetadataWorkUnit]:
|
|
3278
3306
|
workbook_container_key = self.gen_workbook_key(workbook[c.ID])
|
|
3279
|
-
creator = workbook.get(c.OWNER, {})
|
|
3307
|
+
creator = self._get_owner_identifier(workbook.get(c.OWNER, {}))
|
|
3280
3308
|
|
|
3281
3309
|
owner_urn = (
|
|
3282
3310
|
builder.make_user_urn(creator)
|
|
@@ -3458,7 +3486,7 @@ class TableauSiteSource:
|
|
|
3458
3486
|
|
|
3459
3487
|
creator: Optional[str] = None
|
|
3460
3488
|
if workbook is not None and workbook.get(c.OWNER) is not None:
|
|
3461
|
-
creator = workbook[c.OWNER]
|
|
3489
|
+
creator = self._get_owner_identifier(workbook[c.OWNER])
|
|
3462
3490
|
created_at = dashboard.get(c.CREATED_AT, datetime.now())
|
|
3463
3491
|
updated_at = dashboard.get(c.UPDATED_AT, datetime.now())
|
|
3464
3492
|
last_modified = self.get_last_modified(creator, created_at, updated_at)
|
|
@@ -3605,6 +3633,20 @@ class TableauSiteSource:
|
|
|
3605
3633
|
)
|
|
3606
3634
|
return last_modified
|
|
3607
3635
|
|
|
3636
|
+
def _get_owner_identifier(self, owner_dict: dict) -> Optional[str]:
|
|
3637
|
+
"""Extract owner identifier (email or username) based on configuration."""
|
|
3638
|
+
if not owner_dict:
|
|
3639
|
+
return None
|
|
3640
|
+
|
|
3641
|
+
if self.config.use_email_as_username:
|
|
3642
|
+
email = owner_dict.get(c.EMAIL)
|
|
3643
|
+
if email:
|
|
3644
|
+
return email
|
|
3645
|
+
# Fall back to username if email is not available
|
|
3646
|
+
self.report.num_email_fallback_to_username += 1
|
|
3647
|
+
|
|
3648
|
+
return owner_dict.get(c.USERNAME)
|
|
3649
|
+
|
|
3608
3650
|
@lru_cache(maxsize=None)
|
|
3609
3651
|
def _get_ownership(self, user: str) -> Optional[OwnershipClass]:
|
|
3610
3652
|
if self.config.ingest_owner and user:
|
|
@@ -3828,3 +3870,15 @@ class TableauSiteSource:
|
|
|
3828
3870
|
self.report.emit_upstream_tables_timer[self.site_content_url] = (
|
|
3829
3871
|
timer.elapsed_seconds(digits=2)
|
|
3830
3872
|
)
|
|
3873
|
+
|
|
3874
|
+
# Log owner extraction statistics if there were fallbacks
|
|
3875
|
+
if (
|
|
3876
|
+
self.config.use_email_as_username
|
|
3877
|
+
and self.config.ingest_owner
|
|
3878
|
+
and self.report.num_email_fallback_to_username > 0
|
|
3879
|
+
):
|
|
3880
|
+
logger.info(
|
|
3881
|
+
f"Owner extraction summary for site '{self.site_content_url}': "
|
|
3882
|
+
f"{self.report.num_email_fallback_to_username} entities fell back from email to username "
|
|
3883
|
+
f"(email was not available)"
|
|
3884
|
+
)
|
|
@@ -65,6 +65,7 @@ workbook_graphql_query = """
|
|
|
65
65
|
projectName
|
|
66
66
|
owner {
|
|
67
67
|
username
|
|
68
|
+
email
|
|
68
69
|
}
|
|
69
70
|
description
|
|
70
71
|
uri
|
|
@@ -107,6 +108,7 @@ sheet_graphql_query = """
|
|
|
107
108
|
luid
|
|
108
109
|
owner {
|
|
109
110
|
username
|
|
111
|
+
email
|
|
110
112
|
}
|
|
111
113
|
}
|
|
112
114
|
datasourceFields {
|
|
@@ -185,6 +187,7 @@ dashboard_graphql_query = """
|
|
|
185
187
|
luid
|
|
186
188
|
owner {
|
|
187
189
|
username
|
|
190
|
+
email
|
|
188
191
|
}
|
|
189
192
|
}
|
|
190
193
|
}
|
|
@@ -268,6 +271,7 @@ embedded_datasource_graphql_query = """
|
|
|
268
271
|
luid
|
|
269
272
|
owner {
|
|
270
273
|
username
|
|
274
|
+
email
|
|
271
275
|
}
|
|
272
276
|
}
|
|
273
277
|
}
|
|
@@ -424,6 +428,7 @@ published_datasource_graphql_query = """
|
|
|
424
428
|
}
|
|
425
429
|
owner {
|
|
426
430
|
username
|
|
431
|
+
email
|
|
427
432
|
}
|
|
428
433
|
description
|
|
429
434
|
uri
|
|
@@ -59,6 +59,7 @@ LUID = "luid"
|
|
|
59
59
|
EMBEDDED_DATA_SOURCE = "EmbeddedDatasource"
|
|
60
60
|
OWNER = "owner"
|
|
61
61
|
USERNAME = "username"
|
|
62
|
+
EMAIL = "email"
|
|
62
63
|
HAS_EXTRACTS = "hasExtracts"
|
|
63
64
|
EXTRACT_LAST_REFRESH_TIME = "extractLastRefreshTime"
|
|
64
65
|
EXTRACT_LAST_INCREMENTAL_UPDATE_TIME = "extractLastIncrementalUpdateTime"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
2
3
|
|
|
3
4
|
from tableauserverclient import Server, UserItem
|
|
4
5
|
|
|
@@ -10,6 +11,7 @@ class UserInfo:
|
|
|
10
11
|
user_name: str
|
|
11
12
|
site_role: str
|
|
12
13
|
site_id: str
|
|
14
|
+
email: Optional[str] = None
|
|
13
15
|
|
|
14
16
|
def has_site_administrator_explorer_privileges(self):
|
|
15
17
|
return self.site_role in [
|
|
@@ -34,4 +36,5 @@ class UserInfo:
|
|
|
34
36
|
user_name=user.name,
|
|
35
37
|
site_role=user.site_role,
|
|
36
38
|
site_id=server.site_id,
|
|
39
|
+
email=user.email,
|
|
37
40
|
)
|
|
@@ -8,7 +8,12 @@ import pydantic
|
|
|
8
8
|
from pydantic import Field
|
|
9
9
|
from typing_extensions import Literal
|
|
10
10
|
|
|
11
|
-
from datahub.configuration.common import
|
|
11
|
+
from datahub.configuration.common import (
|
|
12
|
+
AllowDenyPattern,
|
|
13
|
+
ConfigEnum,
|
|
14
|
+
ConfigModel,
|
|
15
|
+
HiddenFromDocs,
|
|
16
|
+
)
|
|
12
17
|
from datahub.configuration.source_common import (
|
|
13
18
|
DatasetSourceConfigMixin,
|
|
14
19
|
LowerCaseDatasetUrnConfigMixin,
|
|
@@ -285,10 +290,9 @@ class UnityCatalogSourceConfig(
|
|
|
285
290
|
description="Limit the number of columns to get column level lineage. ",
|
|
286
291
|
)
|
|
287
292
|
|
|
288
|
-
lineage_max_workers: int = pydantic.Field(
|
|
293
|
+
lineage_max_workers: HiddenFromDocs[int] = pydantic.Field(
|
|
289
294
|
default=5 * (os.cpu_count() or 4),
|
|
290
295
|
description="Number of worker threads to use for column lineage thread pool executor. Set to 1 to disable.",
|
|
291
|
-
hidden_from_docs=True,
|
|
292
296
|
)
|
|
293
297
|
|
|
294
298
|
databricks_api_page_size: int = pydantic.Field(
|
|
@@ -18,7 +18,7 @@ import pydantic
|
|
|
18
18
|
from pydantic.fields import Field
|
|
19
19
|
|
|
20
20
|
import datahub.emitter.mce_builder as builder
|
|
21
|
-
from datahub.configuration.common import AllowDenyPattern
|
|
21
|
+
from datahub.configuration.common import AllowDenyPattern, HiddenFromDocs
|
|
22
22
|
from datahub.configuration.time_window_config import (
|
|
23
23
|
BaseTimeWindowConfig,
|
|
24
24
|
BucketDuration,
|
|
@@ -194,13 +194,13 @@ class GenericAggregatedDataset(Generic[ResourceType]):
|
|
|
194
194
|
|
|
195
195
|
|
|
196
196
|
class BaseUsageConfig(BaseTimeWindowConfig):
|
|
197
|
-
queries_character_limit: int = Field(
|
|
197
|
+
queries_character_limit: HiddenFromDocs[int] = Field(
|
|
198
|
+
# Hidden since we don't want to encourage people to break elasticsearch.
|
|
198
199
|
default=DEFAULT_QUERIES_CHARACTER_LIMIT,
|
|
199
200
|
description=(
|
|
200
201
|
"Total character limit for all queries in a single usage aspect."
|
|
201
202
|
" Queries will be truncated to length `queries_character_limit / top_n_queries`."
|
|
202
203
|
),
|
|
203
|
-
hidden_from_docs=True, # Don't want to encourage people to break elasticsearch
|
|
204
204
|
)
|
|
205
205
|
|
|
206
206
|
top_n_queries: pydantic.PositiveInt = Field(
|
|
@@ -2,6 +2,7 @@ import re
|
|
|
2
2
|
from typing import Dict, List, Optional, Union
|
|
3
3
|
from urllib.parse import urlparse
|
|
4
4
|
|
|
5
|
+
import pydantic
|
|
5
6
|
from pydantic import Field, validator
|
|
6
7
|
|
|
7
8
|
from datahub.configuration.common import AllowDenyPattern
|
|
@@ -121,7 +122,8 @@ class PulsarSourceConfig(
|
|
|
121
122
|
)
|
|
122
123
|
return client_secret
|
|
123
124
|
|
|
124
|
-
@
|
|
125
|
+
@pydantic.field_validator("web_service_url", mode="after")
|
|
126
|
+
@classmethod
|
|
125
127
|
def web_service_url_scheme_host_port(cls, val: str) -> str:
|
|
126
128
|
# Tokenize the web url
|
|
127
129
|
url = urlparse(val)
|
|
@@ -5356,6 +5356,7 @@ class InstitutionalMemoryMetadataClass(DictWrapper):
|
|
|
5356
5356
|
description: str,
|
|
5357
5357
|
createStamp: "AuditStampClass",
|
|
5358
5358
|
updateStamp: Union[None, "AuditStampClass"]=None,
|
|
5359
|
+
settings: Union[None, "InstitutionalMemoryMetadataSettingsClass"]=None,
|
|
5359
5360
|
):
|
|
5360
5361
|
super().__init__()
|
|
5361
5362
|
|
|
@@ -5363,12 +5364,14 @@ class InstitutionalMemoryMetadataClass(DictWrapper):
|
|
|
5363
5364
|
self.description = description
|
|
5364
5365
|
self.createStamp = createStamp
|
|
5365
5366
|
self.updateStamp = updateStamp
|
|
5367
|
+
self.settings = settings
|
|
5366
5368
|
|
|
5367
5369
|
def _restore_defaults(self) -> None:
|
|
5368
5370
|
self.url = str()
|
|
5369
5371
|
self.description = str()
|
|
5370
5372
|
self.createStamp = AuditStampClass._construct_with_defaults()
|
|
5371
5373
|
self.updateStamp = self.RECORD_SCHEMA.fields_dict["updateStamp"].default
|
|
5374
|
+
self.settings = self.RECORD_SCHEMA.fields_dict["settings"].default
|
|
5372
5375
|
|
|
5373
5376
|
|
|
5374
5377
|
@property
|
|
@@ -5411,6 +5414,45 @@ class InstitutionalMemoryMetadataClass(DictWrapper):
|
|
|
5411
5414
|
self._inner_dict['updateStamp'] = value
|
|
5412
5415
|
|
|
5413
5416
|
|
|
5417
|
+
@property
|
|
5418
|
+
def settings(self) -> Union[None, "InstitutionalMemoryMetadataSettingsClass"]:
|
|
5419
|
+
"""Settings for this record"""
|
|
5420
|
+
return self._inner_dict.get('settings') # type: ignore
|
|
5421
|
+
|
|
5422
|
+
@settings.setter
|
|
5423
|
+
def settings(self, value: Union[None, "InstitutionalMemoryMetadataSettingsClass"]) -> None:
|
|
5424
|
+
self._inner_dict['settings'] = value
|
|
5425
|
+
|
|
5426
|
+
|
|
5427
|
+
class InstitutionalMemoryMetadataSettingsClass(DictWrapper):
|
|
5428
|
+
"""Settings related to a record of InstitutionalMemoryMetadata"""
|
|
5429
|
+
|
|
5430
|
+
RECORD_SCHEMA = get_schema_type("com.linkedin.pegasus2avro.common.InstitutionalMemoryMetadataSettings")
|
|
5431
|
+
def __init__(self,
|
|
5432
|
+
showInAssetPreview: Optional[bool]=None,
|
|
5433
|
+
):
|
|
5434
|
+
super().__init__()
|
|
5435
|
+
|
|
5436
|
+
if showInAssetPreview is None:
|
|
5437
|
+
# default: False
|
|
5438
|
+
self.showInAssetPreview = self.RECORD_SCHEMA.fields_dict["showInAssetPreview"].default
|
|
5439
|
+
else:
|
|
5440
|
+
self.showInAssetPreview = showInAssetPreview
|
|
5441
|
+
|
|
5442
|
+
def _restore_defaults(self) -> None:
|
|
5443
|
+
self.showInAssetPreview = self.RECORD_SCHEMA.fields_dict["showInAssetPreview"].default
|
|
5444
|
+
|
|
5445
|
+
|
|
5446
|
+
@property
|
|
5447
|
+
def showInAssetPreview(self) -> bool:
|
|
5448
|
+
"""Show record in asset preview like on entity header and search previews"""
|
|
5449
|
+
return self._inner_dict.get('showInAssetPreview') # type: ignore
|
|
5450
|
+
|
|
5451
|
+
@showInAssetPreview.setter
|
|
5452
|
+
def showInAssetPreview(self, value: bool) -> None:
|
|
5453
|
+
self._inner_dict['showInAssetPreview'] = value
|
|
5454
|
+
|
|
5455
|
+
|
|
5414
5456
|
class MLFeatureDataTypeClass(object):
|
|
5415
5457
|
"""MLFeature Data Type"""
|
|
5416
5458
|
|
|
@@ -16689,7 +16731,7 @@ class MLModelGroupKeyClass(_Aspect):
|
|
|
16689
16731
|
|
|
16690
16732
|
|
|
16691
16733
|
ASPECT_NAME = 'mlModelGroupKey'
|
|
16692
|
-
ASPECT_INFO = {'keyForEntity': 'mlModelGroup', 'entityCategory': 'core', 'entityAspects': ['glossaryTerms', 'editableMlModelGroupProperties', 'domains', 'applications', 'mlModelGroupProperties', 'ownership', 'status', 'deprecation', 'browsePaths', 'globalTags', 'dataPlatformInstance', 'browsePathsV2', 'structuredProperties', 'forms', 'testResults', 'subTypes', 'container']}
|
|
16734
|
+
ASPECT_INFO = {'keyForEntity': 'mlModelGroup', 'entityCategory': 'core', 'entityAspects': ['glossaryTerms', 'editableMlModelGroupProperties', 'domains', 'applications', 'mlModelGroupProperties', 'ownership', 'status', 'deprecation', 'browsePaths', 'globalTags', 'dataPlatformInstance', 'browsePathsV2', 'structuredProperties', 'forms', 'testResults', 'subTypes', 'container', 'institutionalMemory']}
|
|
16693
16735
|
RECORD_SCHEMA = get_schema_type("com.linkedin.pegasus2avro.metadata.key.MLModelGroupKey")
|
|
16694
16736
|
|
|
16695
16737
|
def __init__(self,
|
|
@@ -27420,6 +27462,7 @@ __SCHEMA_TYPES = {
|
|
|
27420
27462
|
'com.linkedin.pegasus2avro.common.InputFields': InputFieldsClass,
|
|
27421
27463
|
'com.linkedin.pegasus2avro.common.InstitutionalMemory': InstitutionalMemoryClass,
|
|
27422
27464
|
'com.linkedin.pegasus2avro.common.InstitutionalMemoryMetadata': InstitutionalMemoryMetadataClass,
|
|
27465
|
+
'com.linkedin.pegasus2avro.common.InstitutionalMemoryMetadataSettings': InstitutionalMemoryMetadataSettingsClass,
|
|
27423
27466
|
'com.linkedin.pegasus2avro.common.MLFeatureDataType': MLFeatureDataTypeClass,
|
|
27424
27467
|
'com.linkedin.pegasus2avro.common.Media': MediaClass,
|
|
27425
27468
|
'com.linkedin.pegasus2avro.common.MediaType': MediaTypeClass,
|
|
@@ -27939,6 +27982,7 @@ __SCHEMA_TYPES = {
|
|
|
27939
27982
|
'InputFields': InputFieldsClass,
|
|
27940
27983
|
'InstitutionalMemory': InstitutionalMemoryClass,
|
|
27941
27984
|
'InstitutionalMemoryMetadata': InstitutionalMemoryMetadataClass,
|
|
27985
|
+
'InstitutionalMemoryMetadataSettings': InstitutionalMemoryMetadataSettingsClass,
|
|
27942
27986
|
'MLFeatureDataType': MLFeatureDataTypeClass,
|
|
27943
27987
|
'Media': MediaClass,
|
|
27944
27988
|
'MediaType': MediaTypeClass,
|
|
@@ -45,6 +45,7 @@ from .....schema_classes import InputFieldClass
|
|
|
45
45
|
from .....schema_classes import InputFieldsClass
|
|
46
46
|
from .....schema_classes import InstitutionalMemoryClass
|
|
47
47
|
from .....schema_classes import InstitutionalMemoryMetadataClass
|
|
48
|
+
from .....schema_classes import InstitutionalMemoryMetadataSettingsClass
|
|
48
49
|
from .....schema_classes import MLFeatureDataTypeClass
|
|
49
50
|
from .....schema_classes import MediaClass
|
|
50
51
|
from .....schema_classes import MediaTypeClass
|
|
@@ -111,6 +112,7 @@ InputField = InputFieldClass
|
|
|
111
112
|
InputFields = InputFieldsClass
|
|
112
113
|
InstitutionalMemory = InstitutionalMemoryClass
|
|
113
114
|
InstitutionalMemoryMetadata = InstitutionalMemoryMetadataClass
|
|
115
|
+
InstitutionalMemoryMetadataSettings = InstitutionalMemoryMetadataSettingsClass
|
|
114
116
|
MLFeatureDataType = MLFeatureDataTypeClass
|
|
115
117
|
Media = MediaClass
|
|
116
118
|
MediaType = MediaTypeClass
|
datahub/metadata/schema.avsc
CHANGED
|
@@ -1074,6 +1074,28 @@
|
|
|
1074
1074
|
"name": "updateStamp",
|
|
1075
1075
|
"default": null,
|
|
1076
1076
|
"doc": "Audit stamp associated with updation of this record"
|
|
1077
|
+
},
|
|
1078
|
+
{
|
|
1079
|
+
"type": [
|
|
1080
|
+
"null",
|
|
1081
|
+
{
|
|
1082
|
+
"type": "record",
|
|
1083
|
+
"name": "InstitutionalMemoryMetadataSettings",
|
|
1084
|
+
"namespace": "com.linkedin.pegasus2avro.common",
|
|
1085
|
+
"fields": [
|
|
1086
|
+
{
|
|
1087
|
+
"type": "boolean",
|
|
1088
|
+
"name": "showInAssetPreview",
|
|
1089
|
+
"default": false,
|
|
1090
|
+
"doc": "Show record in asset preview like on entity header and search previews"
|
|
1091
|
+
}
|
|
1092
|
+
],
|
|
1093
|
+
"doc": "Settings related to a record of InstitutionalMemoryMetadata"
|
|
1094
|
+
}
|
|
1095
|
+
],
|
|
1096
|
+
"name": "settings",
|
|
1097
|
+
"default": null,
|
|
1098
|
+
"doc": "Settings for this record"
|
|
1077
1099
|
}
|
|
1078
1100
|
],
|
|
1079
1101
|
"doc": "Metadata corresponding to a record of institutional memory."
|
|
@@ -4280,7 +4302,8 @@
|
|
|
4280
4302
|
"forms",
|
|
4281
4303
|
"testResults",
|
|
4282
4304
|
"subTypes",
|
|
4283
|
-
"container"
|
|
4305
|
+
"container",
|
|
4306
|
+
"institutionalMemory"
|
|
4284
4307
|
]
|
|
4285
4308
|
},
|
|
4286
4309
|
"name": "MLModelGroupKey",
|
|
@@ -84,6 +84,28 @@
|
|
|
84
84
|
"name": "updateStamp",
|
|
85
85
|
"default": null,
|
|
86
86
|
"doc": "Audit stamp associated with updation of this record"
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
"type": [
|
|
90
|
+
"null",
|
|
91
|
+
{
|
|
92
|
+
"type": "record",
|
|
93
|
+
"name": "InstitutionalMemoryMetadataSettings",
|
|
94
|
+
"namespace": "com.linkedin.pegasus2avro.common",
|
|
95
|
+
"fields": [
|
|
96
|
+
{
|
|
97
|
+
"type": "boolean",
|
|
98
|
+
"name": "showInAssetPreview",
|
|
99
|
+
"default": false,
|
|
100
|
+
"doc": "Show record in asset preview like on entity header and search previews"
|
|
101
|
+
}
|
|
102
|
+
],
|
|
103
|
+
"doc": "Settings related to a record of InstitutionalMemoryMetadata"
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"name": "settings",
|
|
107
|
+
"default": null,
|
|
108
|
+
"doc": "Settings for this record"
|
|
87
109
|
}
|
|
88
110
|
],
|
|
89
111
|
"doc": "Metadata corresponding to a record of institutional memory."
|
|
@@ -1143,6 +1143,28 @@
|
|
|
1143
1143
|
"name": "updateStamp",
|
|
1144
1144
|
"default": null,
|
|
1145
1145
|
"doc": "Audit stamp associated with updation of this record"
|
|
1146
|
+
},
|
|
1147
|
+
{
|
|
1148
|
+
"type": [
|
|
1149
|
+
"null",
|
|
1150
|
+
{
|
|
1151
|
+
"type": "record",
|
|
1152
|
+
"name": "InstitutionalMemoryMetadataSettings",
|
|
1153
|
+
"namespace": "com.linkedin.pegasus2avro.common",
|
|
1154
|
+
"fields": [
|
|
1155
|
+
{
|
|
1156
|
+
"type": "boolean",
|
|
1157
|
+
"name": "showInAssetPreview",
|
|
1158
|
+
"default": false,
|
|
1159
|
+
"doc": "Show record in asset preview like on entity header and search previews"
|
|
1160
|
+
}
|
|
1161
|
+
],
|
|
1162
|
+
"doc": "Settings related to a record of InstitutionalMemoryMetadata"
|
|
1163
|
+
}
|
|
1164
|
+
],
|
|
1165
|
+
"name": "settings",
|
|
1166
|
+
"default": null,
|
|
1167
|
+
"doc": "Settings for this record"
|
|
1146
1168
|
}
|
|
1147
1169
|
],
|
|
1148
1170
|
"doc": "Metadata corresponding to a record of institutional memory."
|
datahub/sdk/dashboard.py
CHANGED
datahub/sdk/search_filters.py
CHANGED
|
@@ -39,13 +39,7 @@ _OrFilters = List[_AndSearchFilterRule]
|
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
class _BaseFilter(ConfigModel):
|
|
42
|
-
|
|
43
|
-
# We can't wrap this in a TYPE_CHECKING block because the pydantic plugin
|
|
44
|
-
# doesn't recognize it properly. So unfortunately we'll need to live
|
|
45
|
-
# with the deprecation warning w/ pydantic v2.
|
|
46
|
-
allow_population_by_field_name = True
|
|
47
|
-
if PYDANTIC_VERSION_2:
|
|
48
|
-
populate_by_name = True
|
|
42
|
+
model_config = pydantic.ConfigDict(populate_by_name=True)
|
|
49
43
|
|
|
50
44
|
@abc.abstractmethod
|
|
51
45
|
def compile(self) -> _OrFilters: ...
|
|
File without changes
|
{acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|
|
File without changes
|