acryl-datahub 1.1.1rc4__py3-none-any.whl → 1.3.0.1rc9__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.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/METADATA +2615 -2547
- {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/RECORD +412 -338
- {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/entry_points.txt +5 -0
- datahub/_version.py +1 -1
- datahub/api/entities/assertion/assertion.py +1 -1
- datahub/api/entities/common/serialized_value.py +1 -1
- datahub/api/entities/corpgroup/corpgroup.py +1 -1
- datahub/api/entities/dataproduct/dataproduct.py +32 -3
- datahub/api/entities/dataset/dataset.py +26 -23
- datahub/api/entities/external/__init__.py +0 -0
- datahub/api/entities/external/external_entities.py +724 -0
- datahub/api/entities/external/external_tag.py +147 -0
- datahub/api/entities/external/lake_formation_external_entites.py +162 -0
- datahub/api/entities/external/restricted_text.py +172 -0
- datahub/api/entities/external/unity_catalog_external_entites.py +172 -0
- datahub/api/entities/forms/forms.py +3 -3
- datahub/api/entities/structuredproperties/structuredproperties.py +4 -4
- datahub/api/graphql/operation.py +10 -6
- datahub/cli/check_cli.py +88 -7
- datahub/cli/cli_utils.py +63 -0
- datahub/cli/config_utils.py +18 -10
- datahub/cli/container_cli.py +5 -0
- datahub/cli/delete_cli.py +125 -27
- datahub/cli/docker_check.py +110 -14
- datahub/cli/docker_cli.py +153 -229
- datahub/cli/exists_cli.py +0 -2
- datahub/cli/get_cli.py +0 -2
- datahub/cli/graphql_cli.py +1422 -0
- datahub/cli/iceberg_cli.py +5 -0
- datahub/cli/ingest_cli.py +3 -15
- datahub/cli/migrate.py +2 -0
- datahub/cli/put_cli.py +1 -4
- datahub/cli/quickstart_versioning.py +53 -10
- datahub/cli/specific/assertions_cli.py +37 -6
- datahub/cli/specific/datacontract_cli.py +54 -7
- datahub/cli/specific/dataproduct_cli.py +2 -15
- datahub/cli/specific/dataset_cli.py +1 -8
- datahub/cli/specific/forms_cli.py +0 -4
- datahub/cli/specific/group_cli.py +0 -2
- datahub/cli/specific/structuredproperties_cli.py +1 -4
- datahub/cli/specific/user_cli.py +172 -3
- datahub/cli/state_cli.py +0 -2
- datahub/cli/timeline_cli.py +0 -2
- datahub/configuration/common.py +40 -1
- datahub/configuration/connection_resolver.py +5 -2
- datahub/configuration/env_vars.py +331 -0
- datahub/configuration/import_resolver.py +7 -4
- datahub/configuration/kafka.py +21 -1
- datahub/configuration/pydantic_migration_helpers.py +6 -13
- datahub/configuration/source_common.py +3 -2
- datahub/configuration/validate_field_deprecation.py +5 -2
- datahub/configuration/validate_field_removal.py +8 -2
- datahub/configuration/validate_field_rename.py +6 -5
- datahub/configuration/validate_multiline_string.py +5 -2
- datahub/emitter/mce_builder.py +8 -4
- datahub/emitter/rest_emitter.py +103 -30
- datahub/entrypoints.py +6 -3
- datahub/ingestion/api/auto_work_units/auto_ensure_aspect_size.py +297 -1
- datahub/ingestion/api/auto_work_units/auto_validate_input_fields.py +87 -0
- datahub/ingestion/api/decorators.py +15 -3
- datahub/ingestion/api/report.py +381 -3
- datahub/ingestion/api/sink.py +27 -2
- datahub/ingestion/api/source.py +165 -58
- datahub/ingestion/api/source_protocols.py +23 -0
- datahub/ingestion/autogenerated/__init__.py +0 -0
- datahub/ingestion/autogenerated/capability_summary.json +3652 -0
- datahub/ingestion/autogenerated/lineage.json +402 -0
- datahub/ingestion/autogenerated/lineage_helper.py +177 -0
- datahub/ingestion/extractor/schema_util.py +13 -4
- datahub/ingestion/glossary/classification_mixin.py +5 -0
- datahub/ingestion/graph/client.py +330 -25
- datahub/ingestion/graph/config.py +3 -2
- datahub/ingestion/graph/filters.py +30 -11
- datahub/ingestion/reporting/datahub_ingestion_run_summary_provider.py +21 -11
- datahub/ingestion/run/pipeline.py +81 -11
- datahub/ingestion/run/pipeline_config.py +2 -2
- datahub/ingestion/sink/datahub_kafka.py +1 -0
- datahub/ingestion/sink/datahub_rest.py +13 -5
- datahub/ingestion/sink/file.py +1 -0
- datahub/ingestion/source/abs/config.py +1 -1
- datahub/ingestion/source/abs/datalake_profiler_config.py +1 -1
- datahub/ingestion/source/abs/source.py +15 -30
- datahub/ingestion/source/aws/aws_common.py +185 -13
- datahub/ingestion/source/aws/glue.py +517 -244
- datahub/ingestion/source/aws/platform_resource_repository.py +30 -0
- datahub/ingestion/source/aws/s3_boto_utils.py +100 -5
- datahub/ingestion/source/aws/tag_entities.py +270 -0
- datahub/ingestion/source/azure/azure_common.py +3 -3
- datahub/ingestion/source/bigquery_v2/bigquery.py +67 -24
- datahub/ingestion/source/bigquery_v2/bigquery_config.py +47 -19
- datahub/ingestion/source/bigquery_v2/bigquery_connection.py +12 -1
- datahub/ingestion/source/bigquery_v2/bigquery_queries.py +3 -0
- datahub/ingestion/source/bigquery_v2/bigquery_report.py +0 -2
- datahub/ingestion/source/bigquery_v2/bigquery_schema.py +23 -16
- datahub/ingestion/source/bigquery_v2/bigquery_schema_gen.py +20 -5
- datahub/ingestion/source/bigquery_v2/common.py +1 -1
- datahub/ingestion/source/bigquery_v2/profiler.py +4 -2
- datahub/ingestion/source/bigquery_v2/queries.py +3 -3
- datahub/ingestion/source/bigquery_v2/queries_extractor.py +45 -9
- datahub/ingestion/source/cassandra/cassandra.py +6 -8
- datahub/ingestion/source/cassandra/cassandra_api.py +17 -1
- datahub/ingestion/source/cassandra/cassandra_config.py +5 -0
- datahub/ingestion/source/cassandra/cassandra_profiling.py +7 -6
- datahub/ingestion/source/cassandra/cassandra_utils.py +1 -2
- datahub/ingestion/source/common/gcp_credentials_config.py +3 -1
- datahub/ingestion/source/common/subtypes.py +53 -0
- datahub/ingestion/source/data_lake_common/data_lake_utils.py +37 -0
- datahub/ingestion/source/data_lake_common/object_store.py +115 -27
- datahub/ingestion/source/data_lake_common/path_spec.py +72 -43
- datahub/ingestion/source/datahub/config.py +12 -9
- datahub/ingestion/source/datahub/datahub_database_reader.py +26 -11
- datahub/ingestion/source/datahub/datahub_source.py +10 -0
- datahub/ingestion/source/dbt/dbt_cloud.py +16 -5
- datahub/ingestion/source/dbt/dbt_common.py +224 -9
- datahub/ingestion/source/dbt/dbt_core.py +3 -0
- datahub/ingestion/source/debug/__init__.py +0 -0
- datahub/ingestion/source/debug/datahub_debug.py +300 -0
- datahub/ingestion/source/delta_lake/config.py +9 -5
- datahub/ingestion/source/delta_lake/source.py +8 -0
- datahub/ingestion/source/dremio/dremio_api.py +114 -73
- datahub/ingestion/source/dremio/dremio_aspects.py +3 -2
- datahub/ingestion/source/dremio/dremio_config.py +5 -4
- datahub/ingestion/source/dremio/dremio_reporting.py +22 -3
- datahub/ingestion/source/dremio/dremio_source.py +132 -98
- datahub/ingestion/source/dremio/dremio_sql_queries.py +82 -21
- datahub/ingestion/source/dynamodb/dynamodb.py +11 -8
- datahub/ingestion/source/excel/__init__.py +0 -0
- datahub/ingestion/source/excel/config.py +92 -0
- datahub/ingestion/source/excel/excel_file.py +539 -0
- datahub/ingestion/source/excel/profiling.py +308 -0
- datahub/ingestion/source/excel/report.py +49 -0
- datahub/ingestion/source/excel/source.py +662 -0
- datahub/ingestion/source/excel/util.py +18 -0
- datahub/ingestion/source/feast.py +8 -10
- datahub/ingestion/source/file.py +3 -0
- datahub/ingestion/source/fivetran/config.py +66 -7
- datahub/ingestion/source/fivetran/fivetran.py +227 -43
- datahub/ingestion/source/fivetran/fivetran_log_api.py +37 -8
- datahub/ingestion/source/fivetran/fivetran_query.py +51 -29
- datahub/ingestion/source/fivetran/fivetran_rest_api.py +65 -0
- datahub/ingestion/source/fivetran/response_models.py +97 -0
- datahub/ingestion/source/gc/datahub_gc.py +0 -2
- datahub/ingestion/source/gcs/gcs_source.py +32 -4
- datahub/ingestion/source/ge_data_profiler.py +108 -31
- datahub/ingestion/source/ge_profiling_config.py +26 -11
- datahub/ingestion/source/grafana/entity_mcp_builder.py +272 -0
- datahub/ingestion/source/grafana/field_utils.py +307 -0
- datahub/ingestion/source/grafana/grafana_api.py +142 -0
- datahub/ingestion/source/grafana/grafana_config.py +104 -0
- datahub/ingestion/source/grafana/grafana_source.py +522 -84
- datahub/ingestion/source/grafana/lineage.py +202 -0
- datahub/ingestion/source/grafana/models.py +137 -0
- datahub/ingestion/source/grafana/report.py +90 -0
- datahub/ingestion/source/grafana/types.py +16 -0
- datahub/ingestion/source/hex/api.py +28 -1
- datahub/ingestion/source/hex/hex.py +16 -5
- datahub/ingestion/source/hex/mapper.py +16 -2
- datahub/ingestion/source/hex/model.py +2 -0
- datahub/ingestion/source/hex/query_fetcher.py +1 -1
- datahub/ingestion/source/iceberg/iceberg.py +123 -59
- datahub/ingestion/source/iceberg/iceberg_profiler.py +4 -2
- datahub/ingestion/source/identity/azure_ad.py +1 -1
- datahub/ingestion/source/identity/okta.py +1 -14
- datahub/ingestion/source/kafka/kafka.py +16 -0
- datahub/ingestion/source/kafka_connect/common.py +2 -2
- datahub/ingestion/source/kafka_connect/sink_connectors.py +156 -47
- datahub/ingestion/source/kafka_connect/source_connectors.py +62 -4
- datahub/ingestion/source/looker/looker_common.py +148 -79
- datahub/ingestion/source/looker/looker_config.py +15 -4
- datahub/ingestion/source/looker/looker_constant.py +4 -0
- datahub/ingestion/source/looker/looker_lib_wrapper.py +36 -3
- datahub/ingestion/source/looker/looker_liquid_tag.py +56 -5
- datahub/ingestion/source/looker/looker_source.py +503 -547
- datahub/ingestion/source/looker/looker_view_id_cache.py +1 -1
- datahub/ingestion/source/looker/lookml_concept_context.py +1 -1
- datahub/ingestion/source/looker/lookml_config.py +31 -3
- datahub/ingestion/source/looker/lookml_refinement.py +1 -1
- datahub/ingestion/source/looker/lookml_source.py +96 -117
- datahub/ingestion/source/looker/view_upstream.py +494 -1
- datahub/ingestion/source/metabase.py +32 -6
- datahub/ingestion/source/metadata/business_glossary.py +7 -7
- datahub/ingestion/source/metadata/lineage.py +9 -9
- datahub/ingestion/source/mlflow.py +12 -2
- datahub/ingestion/source/mock_data/__init__.py +0 -0
- datahub/ingestion/source/mock_data/datahub_mock_data.py +533 -0
- datahub/ingestion/source/mock_data/datahub_mock_data_report.py +12 -0
- datahub/ingestion/source/mock_data/table_naming_helper.py +97 -0
- datahub/ingestion/source/mode.py +26 -5
- datahub/ingestion/source/mongodb.py +11 -1
- datahub/ingestion/source/neo4j/neo4j_source.py +83 -144
- datahub/ingestion/source/nifi.py +2 -2
- datahub/ingestion/source/openapi.py +1 -1
- datahub/ingestion/source/powerbi/config.py +47 -21
- datahub/ingestion/source/powerbi/m_query/data_classes.py +1 -0
- datahub/ingestion/source/powerbi/m_query/parser.py +2 -2
- datahub/ingestion/source/powerbi/m_query/pattern_handler.py +100 -10
- datahub/ingestion/source/powerbi/powerbi.py +10 -6
- datahub/ingestion/source/powerbi/rest_api_wrapper/powerbi_api.py +0 -1
- datahub/ingestion/source/powerbi_report_server/report_server.py +0 -23
- datahub/ingestion/source/powerbi_report_server/report_server_domain.py +2 -4
- datahub/ingestion/source/preset.py +3 -3
- datahub/ingestion/source/qlik_sense/data_classes.py +28 -8
- datahub/ingestion/source/qlik_sense/qlik_sense.py +2 -1
- datahub/ingestion/source/redash.py +1 -1
- datahub/ingestion/source/redshift/config.py +15 -9
- datahub/ingestion/source/redshift/datashares.py +1 -1
- datahub/ingestion/source/redshift/lineage.py +386 -687
- datahub/ingestion/source/redshift/query.py +23 -19
- datahub/ingestion/source/redshift/redshift.py +52 -111
- datahub/ingestion/source/redshift/redshift_schema.py +17 -12
- datahub/ingestion/source/redshift/report.py +0 -2
- datahub/ingestion/source/redshift/usage.py +6 -5
- datahub/ingestion/source/s3/report.py +4 -2
- datahub/ingestion/source/s3/source.py +449 -248
- datahub/ingestion/source/sac/sac.py +3 -1
- datahub/ingestion/source/salesforce.py +28 -13
- datahub/ingestion/source/schema/json_schema.py +14 -14
- datahub/ingestion/source/schema_inference/object.py +22 -6
- datahub/ingestion/source/sigma/data_classes.py +3 -0
- datahub/ingestion/source/sigma/sigma.py +7 -1
- datahub/ingestion/source/slack/slack.py +10 -16
- datahub/ingestion/source/snaplogic/__init__.py +0 -0
- datahub/ingestion/source/snaplogic/snaplogic.py +355 -0
- datahub/ingestion/source/snaplogic/snaplogic_config.py +37 -0
- datahub/ingestion/source/snaplogic/snaplogic_lineage_extractor.py +107 -0
- datahub/ingestion/source/snaplogic/snaplogic_parser.py +168 -0
- datahub/ingestion/source/snaplogic/snaplogic_utils.py +31 -0
- datahub/ingestion/source/snowflake/constants.py +3 -0
- datahub/ingestion/source/snowflake/snowflake_config.py +76 -23
- datahub/ingestion/source/snowflake/snowflake_connection.py +24 -8
- datahub/ingestion/source/snowflake/snowflake_lineage_v2.py +19 -6
- datahub/ingestion/source/snowflake/snowflake_queries.py +464 -97
- datahub/ingestion/source/snowflake/snowflake_query.py +77 -5
- datahub/ingestion/source/snowflake/snowflake_report.py +1 -2
- datahub/ingestion/source/snowflake/snowflake_schema.py +352 -16
- datahub/ingestion/source/snowflake/snowflake_schema_gen.py +51 -10
- datahub/ingestion/source/snowflake/snowflake_summary.py +7 -1
- datahub/ingestion/source/snowflake/snowflake_usage_v2.py +8 -2
- datahub/ingestion/source/snowflake/snowflake_utils.py +36 -15
- datahub/ingestion/source/snowflake/snowflake_v2.py +39 -4
- datahub/ingestion/source/snowflake/stored_proc_lineage.py +143 -0
- datahub/ingestion/source/sql/athena.py +217 -25
- datahub/ingestion/source/sql/athena_properties_extractor.py +795 -0
- datahub/ingestion/source/sql/clickhouse.py +24 -8
- datahub/ingestion/source/sql/cockroachdb.py +5 -4
- datahub/ingestion/source/sql/druid.py +2 -2
- datahub/ingestion/source/sql/hana.py +3 -1
- datahub/ingestion/source/sql/hive.py +4 -3
- datahub/ingestion/source/sql/hive_metastore.py +19 -20
- datahub/ingestion/source/sql/mariadb.py +0 -1
- datahub/ingestion/source/sql/mssql/job_models.py +3 -1
- datahub/ingestion/source/sql/mssql/source.py +336 -57
- datahub/ingestion/source/sql/mysql.py +154 -4
- datahub/ingestion/source/sql/oracle.py +5 -5
- datahub/ingestion/source/sql/postgres.py +142 -6
- datahub/ingestion/source/sql/presto.py +2 -1
- datahub/ingestion/source/sql/sql_common.py +281 -49
- datahub/ingestion/source/sql/sql_generic_profiler.py +2 -1
- datahub/ingestion/source/sql/sql_types.py +22 -0
- datahub/ingestion/source/sql/sqlalchemy_uri.py +39 -7
- datahub/ingestion/source/sql/teradata.py +1028 -245
- datahub/ingestion/source/sql/trino.py +11 -1
- datahub/ingestion/source/sql/two_tier_sql_source.py +2 -3
- datahub/ingestion/source/sql/vertica.py +14 -7
- datahub/ingestion/source/sql_queries.py +219 -121
- datahub/ingestion/source/state/checkpoint.py +8 -29
- datahub/ingestion/source/state/entity_removal_state.py +5 -2
- datahub/ingestion/source/state/redundant_run_skip_handler.py +21 -0
- datahub/ingestion/source/state/stateful_ingestion_base.py +36 -11
- datahub/ingestion/source/superset.py +314 -67
- datahub/ingestion/source/tableau/tableau.py +135 -59
- datahub/ingestion/source/tableau/tableau_common.py +9 -2
- datahub/ingestion/source/tableau/tableau_constant.py +1 -4
- datahub/ingestion/source/tableau/tableau_server_wrapper.py +3 -0
- datahub/ingestion/source/unity/config.py +160 -40
- datahub/ingestion/source/unity/connection.py +61 -0
- datahub/ingestion/source/unity/connection_test.py +1 -0
- datahub/ingestion/source/unity/platform_resource_repository.py +19 -0
- datahub/ingestion/source/unity/proxy.py +794 -51
- datahub/ingestion/source/unity/proxy_patch.py +321 -0
- datahub/ingestion/source/unity/proxy_types.py +36 -2
- datahub/ingestion/source/unity/report.py +15 -3
- datahub/ingestion/source/unity/source.py +465 -131
- datahub/ingestion/source/unity/tag_entities.py +197 -0
- datahub/ingestion/source/unity/usage.py +46 -4
- datahub/ingestion/source/usage/clickhouse_usage.py +4 -1
- datahub/ingestion/source/usage/starburst_trino_usage.py +5 -2
- datahub/ingestion/source/usage/usage_common.py +4 -3
- datahub/ingestion/source/vertexai/vertexai.py +1 -1
- datahub/ingestion/source_config/pulsar.py +3 -1
- datahub/ingestion/source_report/ingestion_stage.py +50 -11
- datahub/ingestion/transformer/add_dataset_ownership.py +18 -2
- datahub/ingestion/transformer/base_transformer.py +8 -5
- datahub/ingestion/transformer/set_browse_path.py +112 -0
- datahub/integrations/assertion/snowflake/compiler.py +4 -3
- datahub/metadata/_internal_schema_classes.py +6806 -4871
- datahub/metadata/_urns/urn_defs.py +1767 -1539
- datahub/metadata/com/linkedin/pegasus2avro/application/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/common/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/file/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/identity/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/logical/__init__.py +15 -0
- datahub/metadata/com/linkedin/pegasus2avro/metadata/key/__init__.py +6 -0
- datahub/metadata/com/linkedin/pegasus2avro/module/__init__.py +31 -0
- datahub/metadata/com/linkedin/pegasus2avro/platform/event/v1/__init__.py +4 -0
- datahub/metadata/com/linkedin/pegasus2avro/role/__init__.py +2 -0
- datahub/metadata/com/linkedin/pegasus2avro/settings/asset/__init__.py +19 -0
- datahub/metadata/com/linkedin/pegasus2avro/settings/global/__init__.py +8 -0
- datahub/metadata/com/linkedin/pegasus2avro/template/__init__.py +31 -0
- datahub/metadata/schema.avsc +18395 -16979
- datahub/metadata/schemas/Actors.avsc +38 -1
- datahub/metadata/schemas/ApplicationKey.avsc +31 -0
- datahub/metadata/schemas/ApplicationProperties.avsc +72 -0
- datahub/metadata/schemas/Applications.avsc +38 -0
- datahub/metadata/schemas/AssetSettings.avsc +63 -0
- datahub/metadata/schemas/ChartInfo.avsc +2 -1
- datahub/metadata/schemas/ChartKey.avsc +1 -0
- datahub/metadata/schemas/ContainerKey.avsc +1 -0
- datahub/metadata/schemas/ContainerProperties.avsc +8 -0
- datahub/metadata/schemas/CorpUserEditableInfo.avsc +1 -1
- datahub/metadata/schemas/CorpUserSettings.avsc +50 -0
- datahub/metadata/schemas/DashboardKey.avsc +1 -0
- datahub/metadata/schemas/DataFlowInfo.avsc +8 -0
- datahub/metadata/schemas/DataFlowKey.avsc +1 -0
- datahub/metadata/schemas/DataHubFileInfo.avsc +230 -0
- datahub/metadata/schemas/DataHubFileKey.avsc +21 -0
- datahub/metadata/schemas/DataHubPageModuleKey.avsc +21 -0
- datahub/metadata/schemas/DataHubPageModuleProperties.avsc +298 -0
- datahub/metadata/schemas/DataHubPageTemplateKey.avsc +21 -0
- datahub/metadata/schemas/DataHubPageTemplateProperties.avsc +251 -0
- datahub/metadata/schemas/DataHubPolicyInfo.avsc +12 -1
- datahub/metadata/schemas/DataJobInfo.avsc +8 -0
- datahub/metadata/schemas/DataJobInputOutput.avsc +8 -0
- datahub/metadata/schemas/DataJobKey.avsc +1 -0
- datahub/metadata/schemas/DataProcessKey.avsc +8 -0
- datahub/metadata/schemas/DataProductKey.avsc +3 -1
- datahub/metadata/schemas/DataProductProperties.avsc +1 -1
- datahub/metadata/schemas/DatasetKey.avsc +11 -1
- datahub/metadata/schemas/DatasetUsageStatistics.avsc +8 -0
- datahub/metadata/schemas/DomainKey.avsc +2 -1
- datahub/metadata/schemas/GlobalSettingsInfo.avsc +134 -0
- datahub/metadata/schemas/GlossaryNodeKey.avsc +2 -1
- datahub/metadata/schemas/GlossaryTermKey.avsc +3 -1
- datahub/metadata/schemas/IcebergWarehouseInfo.avsc +8 -0
- datahub/metadata/schemas/IncidentInfo.avsc +3 -3
- datahub/metadata/schemas/InstitutionalMemory.avsc +31 -0
- datahub/metadata/schemas/LogicalParent.avsc +145 -0
- datahub/metadata/schemas/MLFeatureKey.avsc +1 -0
- datahub/metadata/schemas/MLFeatureTableKey.avsc +1 -0
- datahub/metadata/schemas/MLModelDeploymentKey.avsc +8 -0
- datahub/metadata/schemas/MLModelGroupKey.avsc +11 -1
- datahub/metadata/schemas/MLModelKey.avsc +9 -0
- datahub/metadata/schemas/MLPrimaryKeyKey.avsc +1 -0
- datahub/metadata/schemas/MetadataChangeEvent.avsc +151 -47
- datahub/metadata/schemas/MetadataChangeLog.avsc +62 -44
- datahub/metadata/schemas/MetadataChangeProposal.avsc +61 -0
- datahub/metadata/schemas/NotebookKey.avsc +1 -0
- datahub/metadata/schemas/Operation.avsc +4 -2
- datahub/metadata/schemas/Ownership.avsc +69 -0
- datahub/metadata/schemas/QuerySubjects.avsc +1 -12
- datahub/metadata/schemas/RelationshipChangeEvent.avsc +215 -0
- datahub/metadata/schemas/SchemaFieldKey.avsc +4 -1
- datahub/metadata/schemas/StructuredProperties.avsc +69 -0
- datahub/metadata/schemas/StructuredPropertySettings.avsc +9 -0
- datahub/metadata/schemas/SystemMetadata.avsc +61 -0
- datahub/metadata/schemas/UpstreamLineage.avsc +9 -0
- datahub/sdk/__init__.py +2 -0
- datahub/sdk/_all_entities.py +7 -0
- datahub/sdk/_shared.py +249 -5
- datahub/sdk/chart.py +386 -0
- datahub/sdk/container.py +7 -0
- datahub/sdk/dashboard.py +453 -0
- datahub/sdk/dataflow.py +7 -0
- datahub/sdk/datajob.py +45 -13
- datahub/sdk/dataset.py +56 -2
- datahub/sdk/entity_client.py +111 -9
- datahub/sdk/lineage_client.py +663 -82
- datahub/sdk/main_client.py +50 -16
- datahub/sdk/mlmodel.py +120 -38
- datahub/sdk/mlmodelgroup.py +7 -0
- datahub/sdk/search_client.py +7 -3
- datahub/sdk/search_filters.py +304 -36
- datahub/secret/datahub_secret_store.py +3 -0
- datahub/secret/environment_secret_store.py +29 -0
- datahub/secret/file_secret_store.py +49 -0
- datahub/specific/aspect_helpers/fine_grained_lineage.py +76 -0
- datahub/specific/aspect_helpers/siblings.py +73 -0
- datahub/specific/aspect_helpers/structured_properties.py +27 -0
- datahub/specific/chart.py +1 -1
- datahub/specific/datajob.py +15 -1
- datahub/specific/dataproduct.py +4 -0
- datahub/specific/dataset.py +39 -59
- datahub/sql_parsing/split_statements.py +13 -0
- datahub/sql_parsing/sql_parsing_aggregator.py +70 -26
- datahub/sql_parsing/sqlglot_lineage.py +196 -42
- datahub/sql_parsing/sqlglot_utils.py +12 -4
- datahub/sql_parsing/tool_meta_extractor.py +1 -3
- datahub/telemetry/telemetry.py +28 -14
- datahub/testing/sdk_v2_helpers.py +7 -1
- datahub/upgrade/upgrade.py +73 -17
- datahub/utilities/file_backed_collections.py +8 -9
- datahub/utilities/is_pytest.py +3 -2
- datahub/utilities/logging_manager.py +22 -6
- datahub/utilities/mapping.py +29 -2
- datahub/utilities/sample_data.py +5 -4
- datahub/utilities/server_config_util.py +10 -1
- datahub/utilities/sqlalchemy_query_combiner.py +5 -2
- datahub/utilities/stats_collections.py +4 -0
- datahub/utilities/urns/urn.py +41 -2
- datahub/emitter/sql_parsing_builder.py +0 -306
- datahub/ingestion/source/redshift/lineage_v2.py +0 -466
- {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/WHEEL +0 -0
- {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/licenses/LICENSE +0 -0
- {acryl_datahub-1.1.1rc4.dist-info → acryl_datahub-1.3.0.1rc9.dist-info}/top_level.txt +0 -0
datahub/sdk/chart.py
ADDED
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from typing import Dict, List, Optional, Sequence, Type, Union
|
|
5
|
+
|
|
6
|
+
from deprecated.sphinx import deprecated
|
|
7
|
+
from typing_extensions import Self
|
|
8
|
+
|
|
9
|
+
import datahub.metadata.schema_classes as models
|
|
10
|
+
from datahub.emitter.enum_helpers import get_enum_options
|
|
11
|
+
from datahub.metadata.urns import ChartUrn, DatasetUrn, Urn
|
|
12
|
+
from datahub.sdk._shared import (
|
|
13
|
+
ActorUrnOrStr,
|
|
14
|
+
ChangeAuditStampsMixin,
|
|
15
|
+
DataPlatformInstanceUrnOrStr,
|
|
16
|
+
DataPlatformUrnOrStr,
|
|
17
|
+
DatasetUrnOrStr,
|
|
18
|
+
DomainInputType,
|
|
19
|
+
HasContainer,
|
|
20
|
+
HasDomain,
|
|
21
|
+
HasInstitutionalMemory,
|
|
22
|
+
HasOwnership,
|
|
23
|
+
HasPlatformInstance,
|
|
24
|
+
HasSubtype,
|
|
25
|
+
HasTags,
|
|
26
|
+
HasTerms,
|
|
27
|
+
LinksInputType,
|
|
28
|
+
OwnersInputType,
|
|
29
|
+
ParentContainerInputType,
|
|
30
|
+
TagsInputType,
|
|
31
|
+
TermsInputType,
|
|
32
|
+
)
|
|
33
|
+
from datahub.sdk.dataset import Dataset
|
|
34
|
+
from datahub.sdk.entity import Entity, ExtraAspectsType
|
|
35
|
+
from datahub.utilities.sentinels import Unset, unset
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class Chart(
|
|
39
|
+
ChangeAuditStampsMixin,
|
|
40
|
+
HasPlatformInstance,
|
|
41
|
+
HasSubtype,
|
|
42
|
+
HasOwnership,
|
|
43
|
+
HasContainer,
|
|
44
|
+
HasInstitutionalMemory,
|
|
45
|
+
HasTags,
|
|
46
|
+
HasTerms,
|
|
47
|
+
HasDomain,
|
|
48
|
+
Entity,
|
|
49
|
+
):
|
|
50
|
+
"""Represents a chart in DataHub."""
|
|
51
|
+
|
|
52
|
+
__slots__ = ()
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def get_urn_type(cls) -> Type[ChartUrn]:
|
|
56
|
+
"""Get the URN type for charts.
|
|
57
|
+
Returns:
|
|
58
|
+
The ChartUrn class.
|
|
59
|
+
"""
|
|
60
|
+
return ChartUrn
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
*,
|
|
65
|
+
# Identity.
|
|
66
|
+
name: str,
|
|
67
|
+
platform: DataPlatformUrnOrStr,
|
|
68
|
+
display_name: Optional[str] = None,
|
|
69
|
+
platform_instance: Optional[DataPlatformInstanceUrnOrStr] = None,
|
|
70
|
+
# Chart properties.
|
|
71
|
+
description: Optional[str] = "",
|
|
72
|
+
external_url: Optional[str] = None,
|
|
73
|
+
chart_url: Optional[str] = None,
|
|
74
|
+
custom_properties: Optional[Dict[str, str]] = None,
|
|
75
|
+
last_modified: Optional[datetime] = None,
|
|
76
|
+
last_modified_by: Optional[ActorUrnOrStr] = None,
|
|
77
|
+
created_at: Optional[datetime] = None,
|
|
78
|
+
created_by: Optional[ActorUrnOrStr] = None,
|
|
79
|
+
deleted_on: Optional[datetime] = None,
|
|
80
|
+
deleted_by: Optional[ActorUrnOrStr] = None,
|
|
81
|
+
last_refreshed: Optional[datetime] = None,
|
|
82
|
+
chart_type: Optional[Union[str, models.ChartTypeClass]] = None,
|
|
83
|
+
access: Optional[str] = None,
|
|
84
|
+
input_datasets: Optional[Sequence[Union[DatasetUrnOrStr, Dataset]]] = None,
|
|
85
|
+
# Standard aspects.
|
|
86
|
+
parent_container: ParentContainerInputType | Unset = unset,
|
|
87
|
+
subtype: Optional[str] = None,
|
|
88
|
+
owners: Optional[OwnersInputType] = None,
|
|
89
|
+
links: Optional[LinksInputType] = None,
|
|
90
|
+
tags: Optional[TagsInputType] = None,
|
|
91
|
+
terms: Optional[TermsInputType] = None,
|
|
92
|
+
domain: Optional[DomainInputType] = None,
|
|
93
|
+
extra_aspects: ExtraAspectsType = None,
|
|
94
|
+
):
|
|
95
|
+
"""Initialize a new Chart instance."""
|
|
96
|
+
urn = ChartUrn.create_from_ids(
|
|
97
|
+
platform=str(platform),
|
|
98
|
+
name=name,
|
|
99
|
+
platform_instance=str(platform_instance) if platform_instance else None,
|
|
100
|
+
)
|
|
101
|
+
super().__init__(urn)
|
|
102
|
+
self._set_extra_aspects(extra_aspects)
|
|
103
|
+
|
|
104
|
+
self._set_platform_instance(platform, platform_instance)
|
|
105
|
+
self._ensure_chart_props(display_name=display_name)
|
|
106
|
+
self._init_chart_properties(
|
|
107
|
+
description,
|
|
108
|
+
display_name,
|
|
109
|
+
external_url,
|
|
110
|
+
chart_url,
|
|
111
|
+
custom_properties,
|
|
112
|
+
last_modified,
|
|
113
|
+
last_modified_by,
|
|
114
|
+
created_at,
|
|
115
|
+
created_by,
|
|
116
|
+
last_refreshed,
|
|
117
|
+
deleted_on,
|
|
118
|
+
deleted_by,
|
|
119
|
+
chart_type,
|
|
120
|
+
access,
|
|
121
|
+
input_datasets,
|
|
122
|
+
)
|
|
123
|
+
self._init_standard_aspects(
|
|
124
|
+
parent_container, subtype, owners, links, tags, terms, domain
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
@classmethod
|
|
128
|
+
def _new_from_graph(cls, urn: Urn, current_aspects: models.AspectBag) -> Self:
|
|
129
|
+
assert isinstance(urn, ChartUrn)
|
|
130
|
+
entity = cls(
|
|
131
|
+
platform=urn.dashboard_tool,
|
|
132
|
+
name=urn.chart_id,
|
|
133
|
+
)
|
|
134
|
+
return entity._init_from_graph(current_aspects)
|
|
135
|
+
|
|
136
|
+
def _init_chart_properties(
|
|
137
|
+
self,
|
|
138
|
+
description: Optional[str],
|
|
139
|
+
display_name: Optional[str],
|
|
140
|
+
external_url: Optional[str],
|
|
141
|
+
chart_url: Optional[str],
|
|
142
|
+
custom_properties: Optional[Dict[str, str]],
|
|
143
|
+
last_modified: Optional[datetime],
|
|
144
|
+
last_modified_by: Optional[ActorUrnOrStr],
|
|
145
|
+
created_at: Optional[datetime],
|
|
146
|
+
created_by: Optional[ActorUrnOrStr],
|
|
147
|
+
last_refreshed: Optional[datetime],
|
|
148
|
+
deleted_on: Optional[datetime],
|
|
149
|
+
deleted_by: Optional[ActorUrnOrStr],
|
|
150
|
+
chart_type: Optional[Union[str, models.ChartTypeClass]],
|
|
151
|
+
access: Optional[str],
|
|
152
|
+
input_datasets: Optional[Sequence[Union[DatasetUrnOrStr, Dataset]]],
|
|
153
|
+
) -> None:
|
|
154
|
+
"""Initialize chart-specific properties."""
|
|
155
|
+
if description is not None:
|
|
156
|
+
self.set_description(description)
|
|
157
|
+
if display_name is not None:
|
|
158
|
+
self.set_display_name(display_name)
|
|
159
|
+
if external_url is not None:
|
|
160
|
+
self.set_external_url(external_url)
|
|
161
|
+
if chart_url is not None:
|
|
162
|
+
self.set_chart_url(chart_url)
|
|
163
|
+
if custom_properties is not None:
|
|
164
|
+
self.set_custom_properties(custom_properties)
|
|
165
|
+
if last_modified is not None:
|
|
166
|
+
self.set_last_modified(last_modified)
|
|
167
|
+
if last_modified_by is not None:
|
|
168
|
+
self.set_last_modified_by(last_modified_by)
|
|
169
|
+
if created_at is not None:
|
|
170
|
+
self.set_created_at(created_at)
|
|
171
|
+
if created_by is not None:
|
|
172
|
+
self.set_created_by(created_by)
|
|
173
|
+
if deleted_on is not None:
|
|
174
|
+
self.set_deleted_on(deleted_on)
|
|
175
|
+
if deleted_by is not None:
|
|
176
|
+
self.set_deleted_by(deleted_by)
|
|
177
|
+
if last_refreshed is not None:
|
|
178
|
+
self.set_last_refreshed(last_refreshed)
|
|
179
|
+
if chart_type is not None:
|
|
180
|
+
self.set_chart_type(chart_type)
|
|
181
|
+
if access is not None:
|
|
182
|
+
self.set_access(access)
|
|
183
|
+
if input_datasets is not None:
|
|
184
|
+
self.set_input_datasets(input_datasets)
|
|
185
|
+
|
|
186
|
+
def _init_standard_aspects(
|
|
187
|
+
self,
|
|
188
|
+
parent_container: ParentContainerInputType | Unset,
|
|
189
|
+
subtype: Optional[str],
|
|
190
|
+
owners: Optional[OwnersInputType],
|
|
191
|
+
links: Optional[LinksInputType],
|
|
192
|
+
tags: Optional[TagsInputType],
|
|
193
|
+
terms: Optional[TermsInputType],
|
|
194
|
+
domain: Optional[DomainInputType],
|
|
195
|
+
) -> None:
|
|
196
|
+
"""Initialize standard aspects."""
|
|
197
|
+
if parent_container is not unset:
|
|
198
|
+
self._set_container(parent_container)
|
|
199
|
+
if subtype is not None:
|
|
200
|
+
self.set_subtype(subtype)
|
|
201
|
+
if owners is not None:
|
|
202
|
+
self.set_owners(owners)
|
|
203
|
+
if links is not None:
|
|
204
|
+
self.set_links(links)
|
|
205
|
+
if tags is not None:
|
|
206
|
+
self.set_tags(tags)
|
|
207
|
+
if terms is not None:
|
|
208
|
+
self.set_terms(terms)
|
|
209
|
+
if domain is not None:
|
|
210
|
+
self.set_domain(domain)
|
|
211
|
+
|
|
212
|
+
@property
|
|
213
|
+
def urn(self) -> ChartUrn:
|
|
214
|
+
assert isinstance(self._urn, ChartUrn)
|
|
215
|
+
return self._urn
|
|
216
|
+
|
|
217
|
+
def _ensure_chart_props(
|
|
218
|
+
self, display_name: Optional[str] = None
|
|
219
|
+
) -> models.ChartInfoClass:
|
|
220
|
+
"""Ensure chart properties exist, using a safer approach."""
|
|
221
|
+
return self._setdefault_aspect(
|
|
222
|
+
models.ChartInfoClass(
|
|
223
|
+
title=display_name or self.urn.chart_id,
|
|
224
|
+
description="",
|
|
225
|
+
lastModified=models.ChangeAuditStampsClass(),
|
|
226
|
+
)
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
def _get_audit_stamps(self) -> models.ChangeAuditStampsClass:
|
|
230
|
+
"""Get the audit stamps from the chart properties."""
|
|
231
|
+
return self._ensure_chart_props().lastModified
|
|
232
|
+
|
|
233
|
+
def _set_audit_stamps(self, audit_stamps: models.ChangeAuditStampsClass) -> None:
|
|
234
|
+
"""Set the audit stamps on the chart properties."""
|
|
235
|
+
self._ensure_chart_props().lastModified = audit_stamps
|
|
236
|
+
|
|
237
|
+
@property
|
|
238
|
+
def name(self) -> str:
|
|
239
|
+
"""Get the name of the chart."""
|
|
240
|
+
return self.urn.chart_id
|
|
241
|
+
|
|
242
|
+
@property
|
|
243
|
+
@deprecated("Use display_name instead", version="1.2.0.7")
|
|
244
|
+
def title(self) -> str:
|
|
245
|
+
"""Get the display name of the chart."""
|
|
246
|
+
return self.display_name
|
|
247
|
+
|
|
248
|
+
@deprecated("Use set_display_name instead", version="1.2.0.7")
|
|
249
|
+
def set_title(self, title: str) -> None:
|
|
250
|
+
"""Set the display name of the chart."""
|
|
251
|
+
self.set_display_name(title)
|
|
252
|
+
|
|
253
|
+
@property
|
|
254
|
+
def description(self) -> Optional[str]:
|
|
255
|
+
"""Get the description of the chart."""
|
|
256
|
+
return self._ensure_chart_props().description
|
|
257
|
+
|
|
258
|
+
def set_description(self, description: str) -> None:
|
|
259
|
+
"""Set the description of the chart."""
|
|
260
|
+
self._ensure_chart_props().description = description
|
|
261
|
+
|
|
262
|
+
@property
|
|
263
|
+
def display_name(self) -> str:
|
|
264
|
+
"""Get the display name of the chart."""
|
|
265
|
+
return self._ensure_chart_props().title
|
|
266
|
+
|
|
267
|
+
def set_display_name(self, display_name: str) -> None:
|
|
268
|
+
"""Set the display name of the chart."""
|
|
269
|
+
self._ensure_chart_props().title = display_name
|
|
270
|
+
|
|
271
|
+
@property
|
|
272
|
+
def external_url(self) -> Optional[str]:
|
|
273
|
+
"""Get the external URL of the chart."""
|
|
274
|
+
return self._ensure_chart_props().externalUrl
|
|
275
|
+
|
|
276
|
+
def set_external_url(self, external_url: str) -> None:
|
|
277
|
+
"""Set the external URL of the chart."""
|
|
278
|
+
self._ensure_chart_props().externalUrl = external_url
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def chart_url(self) -> Optional[str]:
|
|
282
|
+
"""Get the chart URL."""
|
|
283
|
+
return self._ensure_chart_props().chartUrl
|
|
284
|
+
|
|
285
|
+
def set_chart_url(self, chart_url: str) -> None:
|
|
286
|
+
"""Set the chart URL."""
|
|
287
|
+
self._ensure_chart_props().chartUrl = chart_url
|
|
288
|
+
|
|
289
|
+
@property
|
|
290
|
+
def custom_properties(self) -> Dict[str, str]:
|
|
291
|
+
"""Get the custom properties of the chart."""
|
|
292
|
+
return self._ensure_chart_props().customProperties
|
|
293
|
+
|
|
294
|
+
def set_custom_properties(self, custom_properties: Dict[str, str]) -> None:
|
|
295
|
+
"""Set the custom properties of the chart."""
|
|
296
|
+
self._ensure_chart_props().customProperties = custom_properties
|
|
297
|
+
|
|
298
|
+
@property
|
|
299
|
+
def last_refreshed(self) -> Optional[datetime]:
|
|
300
|
+
"""Get the last refresh timestamp of the chart."""
|
|
301
|
+
last_refreshed_time = self._ensure_chart_props().lastRefreshed
|
|
302
|
+
return (
|
|
303
|
+
datetime.fromtimestamp(last_refreshed_time)
|
|
304
|
+
if last_refreshed_time is not None
|
|
305
|
+
else None
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def set_last_refreshed(self, last_refreshed: datetime) -> None:
|
|
309
|
+
"""Set the last refresh timestamp of the chart."""
|
|
310
|
+
chart_props = self._ensure_chart_props()
|
|
311
|
+
chart_props.lastRefreshed = int(last_refreshed.timestamp())
|
|
312
|
+
|
|
313
|
+
@property
|
|
314
|
+
def chart_type(self) -> Optional[str]:
|
|
315
|
+
"""Get the type of the chart as a string."""
|
|
316
|
+
chart_type = self._ensure_chart_props().type
|
|
317
|
+
return str(chart_type) if chart_type is not None else None
|
|
318
|
+
|
|
319
|
+
def set_chart_type(self, chart_type: Union[str, models.ChartTypeClass]) -> None:
|
|
320
|
+
"""Set the type of the chart."""
|
|
321
|
+
if isinstance(chart_type, str):
|
|
322
|
+
chart_type_options = get_enum_options(models.ChartTypeClass)
|
|
323
|
+
if chart_type not in chart_type_options:
|
|
324
|
+
raise ValueError(
|
|
325
|
+
f"Invalid chart type: {chart_type}; valid types are {chart_type_options}"
|
|
326
|
+
)
|
|
327
|
+
self._ensure_chart_props().type = chart_type
|
|
328
|
+
|
|
329
|
+
@property
|
|
330
|
+
def access(self) -> Optional[str]:
|
|
331
|
+
"""Get the access level of the chart as a string."""
|
|
332
|
+
access = self._ensure_chart_props().access
|
|
333
|
+
return str(access) if access is not None else None
|
|
334
|
+
|
|
335
|
+
def set_access(self, access: Union[str, models.AccessLevelClass]) -> None:
|
|
336
|
+
"""Set the access level of the chart."""
|
|
337
|
+
if isinstance(access, str):
|
|
338
|
+
assert access in get_enum_options(models.AccessLevelClass), (
|
|
339
|
+
f"Invalid access level: {access}"
|
|
340
|
+
)
|
|
341
|
+
self._ensure_chart_props().access = access
|
|
342
|
+
|
|
343
|
+
@property
|
|
344
|
+
def input_datasets(self) -> List[DatasetUrn]:
|
|
345
|
+
"""Get the input datasets of the chart."""
|
|
346
|
+
props = self._ensure_chart_props()
|
|
347
|
+
# Convert all inputs to DatasetUrn
|
|
348
|
+
return [DatasetUrn.from_string(input_urn) for input_urn in (props.inputs or [])]
|
|
349
|
+
|
|
350
|
+
def set_input_datasets(
|
|
351
|
+
self, input_datasets: Sequence[Union[DatasetUrnOrStr, Dataset]]
|
|
352
|
+
) -> None:
|
|
353
|
+
"""Set the input datasets of the chart."""
|
|
354
|
+
# Convert all inputs to strings
|
|
355
|
+
inputs = []
|
|
356
|
+
for input_dataset in input_datasets:
|
|
357
|
+
if isinstance(input_dataset, Dataset):
|
|
358
|
+
inputs.append(str(input_dataset.urn))
|
|
359
|
+
else:
|
|
360
|
+
inputs.append(str(input_dataset))
|
|
361
|
+
self._ensure_chart_props().inputs = inputs
|
|
362
|
+
|
|
363
|
+
def add_input_dataset(self, input_dataset: Union[DatasetUrnOrStr, Dataset]) -> None:
|
|
364
|
+
"""Add an input to the chart."""
|
|
365
|
+
if isinstance(input_dataset, Dataset):
|
|
366
|
+
input_dataset_urn = input_dataset.urn
|
|
367
|
+
elif isinstance(input_dataset, str):
|
|
368
|
+
input_dataset_urn = DatasetUrn.from_string(input_dataset)
|
|
369
|
+
else: # isinstance(input_dataset, DatasetUrn)
|
|
370
|
+
input_dataset_urn = input_dataset
|
|
371
|
+
|
|
372
|
+
chart_props = self._ensure_chart_props()
|
|
373
|
+
inputs = chart_props.inputs or []
|
|
374
|
+
if str(input_dataset_urn) not in inputs:
|
|
375
|
+
inputs.append(str(input_dataset_urn))
|
|
376
|
+
chart_props.inputs = inputs
|
|
377
|
+
|
|
378
|
+
def remove_input_dataset(
|
|
379
|
+
self, input_dataset: Union[DatasetUrnOrStr, Dataset]
|
|
380
|
+
) -> None:
|
|
381
|
+
"""Remove an input from the chart."""
|
|
382
|
+
chart_props = self._ensure_chart_props()
|
|
383
|
+
inputs = chart_props.inputs or []
|
|
384
|
+
if input_dataset in inputs:
|
|
385
|
+
inputs.remove(str(input_dataset))
|
|
386
|
+
chart_props.inputs = inputs
|
datahub/sdk/container.py
CHANGED
|
@@ -23,12 +23,14 @@ from datahub.sdk._shared import (
|
|
|
23
23
|
HasInstitutionalMemory,
|
|
24
24
|
HasOwnership,
|
|
25
25
|
HasPlatformInstance,
|
|
26
|
+
HasStructuredProperties,
|
|
26
27
|
HasSubtype,
|
|
27
28
|
HasTags,
|
|
28
29
|
HasTerms,
|
|
29
30
|
LinksInputType,
|
|
30
31
|
OwnersInputType,
|
|
31
32
|
ParentContainerInputType,
|
|
33
|
+
StructuredPropertyInputType,
|
|
32
34
|
TagsInputType,
|
|
33
35
|
TermsInputType,
|
|
34
36
|
make_time_stamp,
|
|
@@ -44,6 +46,7 @@ class Container(
|
|
|
44
46
|
HasContainer,
|
|
45
47
|
HasOwnership,
|
|
46
48
|
HasInstitutionalMemory,
|
|
49
|
+
HasStructuredProperties,
|
|
47
50
|
HasTags,
|
|
48
51
|
HasTerms,
|
|
49
52
|
HasDomain,
|
|
@@ -78,6 +81,7 @@ class Container(
|
|
|
78
81
|
tags: Optional[TagsInputType] = None,
|
|
79
82
|
terms: Optional[TermsInputType] = None,
|
|
80
83
|
domain: Optional[DomainInputType] = None,
|
|
84
|
+
structured_properties: Optional[StructuredPropertyInputType] = None,
|
|
81
85
|
extra_aspects: ExtraAspectsType = None,
|
|
82
86
|
):
|
|
83
87
|
# Hack: while the type annotations say container_key is always a ContainerKey,
|
|
@@ -145,6 +149,9 @@ class Container(
|
|
|
145
149
|
self.set_terms(terms)
|
|
146
150
|
if domain is not None:
|
|
147
151
|
self.set_domain(domain)
|
|
152
|
+
if structured_properties is not None:
|
|
153
|
+
for key, value in structured_properties.items():
|
|
154
|
+
self.set_structured_property(property_urn=key, values=value)
|
|
148
155
|
|
|
149
156
|
@classmethod
|
|
150
157
|
def _new_from_graph(cls, urn: Urn, current_aspects: models.AspectBag) -> Self:
|