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.

Files changed (93) hide show
  1. {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/METADATA +2525 -2609
  2. {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/RECORD +93 -93
  3. datahub/_version.py +1 -1
  4. datahub/api/entities/assertion/assertion.py +1 -1
  5. datahub/api/entities/corpgroup/corpgroup.py +1 -1
  6. datahub/api/entities/dataproduct/dataproduct.py +6 -3
  7. datahub/api/entities/dataset/dataset.py +9 -18
  8. datahub/api/entities/structuredproperties/structuredproperties.py +2 -2
  9. datahub/api/graphql/operation.py +10 -6
  10. datahub/cli/docker_check.py +2 -2
  11. datahub/configuration/common.py +29 -1
  12. datahub/configuration/connection_resolver.py +5 -2
  13. datahub/configuration/import_resolver.py +7 -4
  14. datahub/configuration/pydantic_migration_helpers.py +0 -9
  15. datahub/configuration/source_common.py +3 -2
  16. datahub/configuration/validate_field_deprecation.py +5 -2
  17. datahub/configuration/validate_field_removal.py +5 -2
  18. datahub/configuration/validate_field_rename.py +6 -5
  19. datahub/configuration/validate_multiline_string.py +5 -2
  20. datahub/ingestion/run/pipeline_config.py +2 -2
  21. datahub/ingestion/source/azure/azure_common.py +1 -1
  22. datahub/ingestion/source/bigquery_v2/bigquery_config.py +28 -14
  23. datahub/ingestion/source/bigquery_v2/queries_extractor.py +4 -5
  24. datahub/ingestion/source/common/gcp_credentials_config.py +3 -1
  25. datahub/ingestion/source/data_lake_common/path_spec.py +16 -16
  26. datahub/ingestion/source/datahub/config.py +8 -9
  27. datahub/ingestion/source/delta_lake/config.py +1 -1
  28. datahub/ingestion/source/dremio/dremio_config.py +3 -4
  29. datahub/ingestion/source/feast.py +8 -10
  30. datahub/ingestion/source/fivetran/config.py +1 -1
  31. datahub/ingestion/source/ge_profiling_config.py +26 -22
  32. datahub/ingestion/source/grafana/grafana_config.py +2 -2
  33. datahub/ingestion/source/grafana/models.py +12 -14
  34. datahub/ingestion/source/hex/hex.py +6 -1
  35. datahub/ingestion/source/iceberg/iceberg_profiler.py +4 -2
  36. datahub/ingestion/source/kafka_connect/common.py +2 -2
  37. datahub/ingestion/source/looker/looker_common.py +55 -75
  38. datahub/ingestion/source/looker/looker_config.py +15 -4
  39. datahub/ingestion/source/looker/looker_source.py +445 -548
  40. datahub/ingestion/source/looker/lookml_config.py +1 -1
  41. datahub/ingestion/source/metadata/business_glossary.py +7 -7
  42. datahub/ingestion/source/metadata/lineage.py +1 -1
  43. datahub/ingestion/source/mode.py +13 -5
  44. datahub/ingestion/source/nifi.py +1 -1
  45. datahub/ingestion/source/powerbi/config.py +14 -21
  46. datahub/ingestion/source/preset.py +1 -1
  47. datahub/ingestion/source/qlik_sense/data_classes.py +28 -8
  48. datahub/ingestion/source/redshift/config.py +6 -3
  49. datahub/ingestion/source/salesforce.py +13 -9
  50. datahub/ingestion/source/schema/json_schema.py +14 -14
  51. datahub/ingestion/source/sigma/data_classes.py +3 -0
  52. datahub/ingestion/source/snowflake/snowflake_config.py +12 -15
  53. datahub/ingestion/source/snowflake/snowflake_connection.py +8 -3
  54. datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +15 -2
  55. datahub/ingestion/source/snowflake/snowflake_queries.py +4 -5
  56. datahub/ingestion/source/sql/athena.py +2 -1
  57. datahub/ingestion/source/sql/clickhouse.py +12 -7
  58. datahub/ingestion/source/sql/cockroachdb.py +5 -3
  59. datahub/ingestion/source/sql/druid.py +2 -2
  60. datahub/ingestion/source/sql/hive.py +4 -3
  61. datahub/ingestion/source/sql/hive_metastore.py +7 -9
  62. datahub/ingestion/source/sql/mssql/source.py +2 -2
  63. datahub/ingestion/source/sql/mysql.py +2 -2
  64. datahub/ingestion/source/sql/oracle.py +3 -3
  65. datahub/ingestion/source/sql/presto.py +2 -1
  66. datahub/ingestion/source/sql/teradata.py +4 -4
  67. datahub/ingestion/source/sql/trino.py +2 -1
  68. datahub/ingestion/source/sql/two_tier_sql_source.py +2 -3
  69. datahub/ingestion/source/sql/vertica.py +1 -1
  70. datahub/ingestion/source/sql_queries.py +6 -6
  71. datahub/ingestion/source/state/checkpoint.py +5 -1
  72. datahub/ingestion/source/state/entity_removal_state.py +5 -2
  73. datahub/ingestion/source/state/stateful_ingestion_base.py +5 -8
  74. datahub/ingestion/source/superset.py +29 -4
  75. datahub/ingestion/source/tableau/tableau.py +65 -11
  76. datahub/ingestion/source/tableau/tableau_common.py +5 -0
  77. datahub/ingestion/source/tableau/tableau_constant.py +1 -0
  78. datahub/ingestion/source/tableau/tableau_server_wrapper.py +3 -0
  79. datahub/ingestion/source/unity/config.py +7 -3
  80. datahub/ingestion/source/usage/usage_common.py +3 -3
  81. datahub/ingestion/source_config/pulsar.py +3 -1
  82. datahub/metadata/_internal_schema_classes.py +45 -1
  83. datahub/metadata/com/linkedin/pegasus2avro/common/__init__.py +2 -0
  84. datahub/metadata/schema.avsc +24 -1
  85. datahub/metadata/schemas/InstitutionalMemory.avsc +22 -0
  86. datahub/metadata/schemas/MLModelGroupKey.avsc +2 -1
  87. datahub/metadata/schemas/MetadataChangeEvent.avsc +22 -0
  88. datahub/sdk/dashboard.py +0 -2
  89. datahub/sdk/search_filters.py +1 -7
  90. {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/WHEEL +0 -0
  91. {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/entry_points.txt +0 -0
  92. {acryl_datahub-1.2.0.10rc2.dist-info → acryl_datahub-1.2.0.10rc4.dist-info}/licenses/LICENSE +0 -0
  93. {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[Literal["worksheet", "dashboard"]], bool] = Field(
625
- default=["worksheet", "dashboard"],
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
- owner = (
2720
- self._get_ownership(datasource_info[c.OWNER][c.USERNAME])
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].get(c.USERNAME)
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, {}).get(c.USERNAME)
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].get(c.USERNAME)
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 AllowDenyPattern, ConfigEnum, ConfigModel
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
- @validator("web_service_url")
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
@@ -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."
@@ -21,7 +21,8 @@
21
21
  "forms",
22
22
  "testResults",
23
23
  "subTypes",
24
- "container"
24
+ "container",
25
+ "institutionalMemory"
25
26
  ]
26
27
  },
27
28
  "name": "MLModelGroupKey",
@@ -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
@@ -171,8 +171,6 @@ class Dashboard(
171
171
  )
172
172
  ),
173
173
  customProperties={},
174
- chartEdges=[],
175
- datasetEdges=[],
176
174
  dashboards=[],
177
175
  )
178
176
  )
@@ -39,13 +39,7 @@ _OrFilters = List[_AndSearchFilterRule]
39
39
 
40
40
 
41
41
  class _BaseFilter(ConfigModel):
42
- class Config:
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: ...