dvt-core 1.11.0b4__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 dvt-core might be problematic. Click here for more details.
- dvt/__init__.py +7 -0
- dvt/_pydantic_shim.py +26 -0
- dvt/adapters/__init__.py +16 -0
- dvt/adapters/multi_adapter_manager.py +268 -0
- dvt/artifacts/__init__.py +0 -0
- dvt/artifacts/exceptions/__init__.py +1 -0
- dvt/artifacts/exceptions/schemas.py +31 -0
- dvt/artifacts/resources/__init__.py +116 -0
- dvt/artifacts/resources/base.py +68 -0
- dvt/artifacts/resources/types.py +93 -0
- dvt/artifacts/resources/v1/analysis.py +10 -0
- dvt/artifacts/resources/v1/catalog.py +23 -0
- dvt/artifacts/resources/v1/components.py +275 -0
- dvt/artifacts/resources/v1/config.py +282 -0
- dvt/artifacts/resources/v1/documentation.py +11 -0
- dvt/artifacts/resources/v1/exposure.py +52 -0
- dvt/artifacts/resources/v1/function.py +53 -0
- dvt/artifacts/resources/v1/generic_test.py +32 -0
- dvt/artifacts/resources/v1/group.py +22 -0
- dvt/artifacts/resources/v1/hook.py +11 -0
- dvt/artifacts/resources/v1/macro.py +30 -0
- dvt/artifacts/resources/v1/metric.py +173 -0
- dvt/artifacts/resources/v1/model.py +146 -0
- dvt/artifacts/resources/v1/owner.py +10 -0
- dvt/artifacts/resources/v1/saved_query.py +112 -0
- dvt/artifacts/resources/v1/seed.py +42 -0
- dvt/artifacts/resources/v1/semantic_layer_components.py +72 -0
- dvt/artifacts/resources/v1/semantic_model.py +315 -0
- dvt/artifacts/resources/v1/singular_test.py +14 -0
- dvt/artifacts/resources/v1/snapshot.py +92 -0
- dvt/artifacts/resources/v1/source_definition.py +85 -0
- dvt/artifacts/resources/v1/sql_operation.py +10 -0
- dvt/artifacts/resources/v1/unit_test_definition.py +78 -0
- dvt/artifacts/schemas/__init__.py +0 -0
- dvt/artifacts/schemas/base.py +191 -0
- dvt/artifacts/schemas/batch_results.py +24 -0
- dvt/artifacts/schemas/catalog/__init__.py +12 -0
- dvt/artifacts/schemas/catalog/v1/__init__.py +0 -0
- dvt/artifacts/schemas/catalog/v1/catalog.py +60 -0
- dvt/artifacts/schemas/freshness/__init__.py +1 -0
- dvt/artifacts/schemas/freshness/v3/__init__.py +0 -0
- dvt/artifacts/schemas/freshness/v3/freshness.py +159 -0
- dvt/artifacts/schemas/manifest/__init__.py +2 -0
- dvt/artifacts/schemas/manifest/v12/__init__.py +0 -0
- dvt/artifacts/schemas/manifest/v12/manifest.py +212 -0
- dvt/artifacts/schemas/results.py +148 -0
- dvt/artifacts/schemas/run/__init__.py +2 -0
- dvt/artifacts/schemas/run/v5/__init__.py +0 -0
- dvt/artifacts/schemas/run/v5/run.py +184 -0
- dvt/artifacts/schemas/upgrades/__init__.py +4 -0
- dvt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
- dvt/artifacts/schemas/upgrades/upgrade_manifest_dbt_version.py +2 -0
- dvt/artifacts/utils/validation.py +153 -0
- dvt/cli/__init__.py +1 -0
- dvt/cli/context.py +16 -0
- dvt/cli/exceptions.py +56 -0
- dvt/cli/flags.py +558 -0
- dvt/cli/main.py +971 -0
- dvt/cli/option_types.py +121 -0
- dvt/cli/options.py +79 -0
- dvt/cli/params.py +803 -0
- dvt/cli/requires.py +478 -0
- dvt/cli/resolvers.py +32 -0
- dvt/cli/types.py +40 -0
- dvt/clients/__init__.py +0 -0
- dvt/clients/checked_load.py +82 -0
- dvt/clients/git.py +164 -0
- dvt/clients/jinja.py +206 -0
- dvt/clients/jinja_static.py +245 -0
- dvt/clients/registry.py +192 -0
- dvt/clients/yaml_helper.py +68 -0
- dvt/compilation.py +833 -0
- dvt/compute/__init__.py +26 -0
- dvt/compute/base.py +288 -0
- dvt/compute/engines/__init__.py +13 -0
- dvt/compute/engines/duckdb_engine.py +368 -0
- dvt/compute/engines/spark_engine.py +273 -0
- dvt/compute/query_analyzer.py +212 -0
- dvt/compute/router.py +483 -0
- dvt/config/__init__.py +4 -0
- dvt/config/catalogs.py +95 -0
- dvt/config/compute_config.py +406 -0
- dvt/config/profile.py +411 -0
- dvt/config/profiles_v2.py +464 -0
- dvt/config/project.py +893 -0
- dvt/config/renderer.py +232 -0
- dvt/config/runtime.py +491 -0
- dvt/config/selectors.py +209 -0
- dvt/config/utils.py +78 -0
- dvt/connectors/.gitignore +6 -0
- dvt/connectors/README.md +306 -0
- dvt/connectors/catalog.yml +217 -0
- dvt/connectors/download_connectors.py +300 -0
- dvt/constants.py +29 -0
- dvt/context/__init__.py +0 -0
- dvt/context/base.py +746 -0
- dvt/context/configured.py +136 -0
- dvt/context/context_config.py +350 -0
- dvt/context/docs.py +82 -0
- dvt/context/exceptions_jinja.py +179 -0
- dvt/context/macro_resolver.py +195 -0
- dvt/context/macros.py +171 -0
- dvt/context/manifest.py +73 -0
- dvt/context/providers.py +2198 -0
- dvt/context/query_header.py +14 -0
- dvt/context/secret.py +59 -0
- dvt/context/target.py +74 -0
- dvt/contracts/__init__.py +0 -0
- dvt/contracts/files.py +413 -0
- dvt/contracts/graph/__init__.py +0 -0
- dvt/contracts/graph/manifest.py +1904 -0
- dvt/contracts/graph/metrics.py +98 -0
- dvt/contracts/graph/model_config.py +71 -0
- dvt/contracts/graph/node_args.py +42 -0
- dvt/contracts/graph/nodes.py +1806 -0
- dvt/contracts/graph/semantic_manifest.py +233 -0
- dvt/contracts/graph/unparsed.py +812 -0
- dvt/contracts/project.py +417 -0
- dvt/contracts/results.py +53 -0
- dvt/contracts/selection.py +23 -0
- dvt/contracts/sql.py +86 -0
- dvt/contracts/state.py +69 -0
- dvt/contracts/util.py +46 -0
- dvt/deprecations.py +347 -0
- dvt/deps/__init__.py +0 -0
- dvt/deps/base.py +153 -0
- dvt/deps/git.py +196 -0
- dvt/deps/local.py +80 -0
- dvt/deps/registry.py +131 -0
- dvt/deps/resolver.py +149 -0
- dvt/deps/tarball.py +121 -0
- dvt/docs/source/_ext/dbt_click.py +118 -0
- dvt/docs/source/conf.py +32 -0
- dvt/env_vars.py +64 -0
- dvt/event_time/event_time.py +40 -0
- dvt/event_time/sample_window.py +60 -0
- dvt/events/__init__.py +16 -0
- dvt/events/base_types.py +37 -0
- dvt/events/core_types_pb2.py +2 -0
- dvt/events/logging.py +109 -0
- dvt/events/types.py +2534 -0
- dvt/exceptions.py +1487 -0
- dvt/flags.py +89 -0
- dvt/graph/__init__.py +11 -0
- dvt/graph/cli.py +248 -0
- dvt/graph/graph.py +172 -0
- dvt/graph/queue.py +213 -0
- dvt/graph/selector.py +375 -0
- dvt/graph/selector_methods.py +976 -0
- dvt/graph/selector_spec.py +223 -0
- dvt/graph/thread_pool.py +18 -0
- dvt/hooks.py +21 -0
- dvt/include/README.md +49 -0
- dvt/include/__init__.py +3 -0
- dvt/include/global_project.py +4 -0
- dvt/include/starter_project/.gitignore +4 -0
- dvt/include/starter_project/README.md +15 -0
- dvt/include/starter_project/__init__.py +3 -0
- dvt/include/starter_project/analyses/.gitkeep +0 -0
- dvt/include/starter_project/dvt_project.yml +36 -0
- dvt/include/starter_project/macros/.gitkeep +0 -0
- dvt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
- dvt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
- dvt/include/starter_project/models/example/schema.yml +21 -0
- dvt/include/starter_project/seeds/.gitkeep +0 -0
- dvt/include/starter_project/snapshots/.gitkeep +0 -0
- dvt/include/starter_project/tests/.gitkeep +0 -0
- dvt/internal_deprecations.py +27 -0
- dvt/jsonschemas/__init__.py +3 -0
- dvt/jsonschemas/jsonschemas.py +309 -0
- dvt/jsonschemas/project/0.0.110.json +4717 -0
- dvt/jsonschemas/project/0.0.85.json +2015 -0
- dvt/jsonschemas/resources/0.0.110.json +2636 -0
- dvt/jsonschemas/resources/0.0.85.json +2536 -0
- dvt/jsonschemas/resources/latest.json +6773 -0
- dvt/links.py +4 -0
- dvt/materializations/__init__.py +0 -0
- dvt/materializations/incremental/__init__.py +0 -0
- dvt/materializations/incremental/microbatch.py +235 -0
- dvt/mp_context.py +8 -0
- dvt/node_types.py +37 -0
- dvt/parser/__init__.py +23 -0
- dvt/parser/analysis.py +21 -0
- dvt/parser/base.py +549 -0
- dvt/parser/common.py +267 -0
- dvt/parser/docs.py +52 -0
- dvt/parser/fixtures.py +51 -0
- dvt/parser/functions.py +30 -0
- dvt/parser/generic_test.py +100 -0
- dvt/parser/generic_test_builders.py +334 -0
- dvt/parser/hooks.py +119 -0
- dvt/parser/macros.py +137 -0
- dvt/parser/manifest.py +2204 -0
- dvt/parser/models.py +574 -0
- dvt/parser/partial.py +1179 -0
- dvt/parser/read_files.py +445 -0
- dvt/parser/schema_generic_tests.py +423 -0
- dvt/parser/schema_renderer.py +111 -0
- dvt/parser/schema_yaml_readers.py +936 -0
- dvt/parser/schemas.py +1467 -0
- dvt/parser/search.py +149 -0
- dvt/parser/seeds.py +28 -0
- dvt/parser/singular_test.py +20 -0
- dvt/parser/snapshots.py +44 -0
- dvt/parser/sources.py +557 -0
- dvt/parser/sql.py +63 -0
- dvt/parser/unit_tests.py +622 -0
- dvt/plugins/__init__.py +20 -0
- dvt/plugins/contracts.py +10 -0
- dvt/plugins/exceptions.py +2 -0
- dvt/plugins/manager.py +164 -0
- dvt/plugins/manifest.py +21 -0
- dvt/profiler.py +20 -0
- dvt/py.typed +1 -0
- dvt/runners/__init__.py +2 -0
- dvt/runners/exposure_runner.py +7 -0
- dvt/runners/no_op_runner.py +46 -0
- dvt/runners/saved_query_runner.py +7 -0
- dvt/selected_resources.py +8 -0
- dvt/task/__init__.py +0 -0
- dvt/task/base.py +504 -0
- dvt/task/build.py +197 -0
- dvt/task/clean.py +57 -0
- dvt/task/clone.py +162 -0
- dvt/task/compile.py +151 -0
- dvt/task/compute.py +366 -0
- dvt/task/debug.py +650 -0
- dvt/task/deps.py +280 -0
- dvt/task/docs/__init__.py +3 -0
- dvt/task/docs/generate.py +408 -0
- dvt/task/docs/index.html +250 -0
- dvt/task/docs/serve.py +28 -0
- dvt/task/freshness.py +323 -0
- dvt/task/function.py +122 -0
- dvt/task/group_lookup.py +46 -0
- dvt/task/init.py +374 -0
- dvt/task/list.py +237 -0
- dvt/task/printer.py +176 -0
- dvt/task/profiles.py +256 -0
- dvt/task/retry.py +175 -0
- dvt/task/run.py +1146 -0
- dvt/task/run_operation.py +142 -0
- dvt/task/runnable.py +802 -0
- dvt/task/seed.py +104 -0
- dvt/task/show.py +150 -0
- dvt/task/snapshot.py +57 -0
- dvt/task/sql.py +111 -0
- dvt/task/test.py +464 -0
- dvt/tests/fixtures/__init__.py +1 -0
- dvt/tests/fixtures/project.py +620 -0
- dvt/tests/util.py +651 -0
- dvt/tracking.py +529 -0
- dvt/utils/__init__.py +3 -0
- dvt/utils/artifact_upload.py +151 -0
- dvt/utils/utils.py +408 -0
- dvt/version.py +249 -0
- dvt_core-1.11.0b4.dist-info/METADATA +252 -0
- dvt_core-1.11.0b4.dist-info/RECORD +261 -0
- dvt_core-1.11.0b4.dist-info/WHEEL +5 -0
- dvt_core-1.11.0b4.dist-info/entry_points.txt +2 -0
- dvt_core-1.11.0b4.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from typing import Any, Dict, Iterator, List
|
|
2
|
+
|
|
3
|
+
from dvt.contracts.graph.manifest import Manifest, Metric
|
|
4
|
+
|
|
5
|
+
from dbt_semantic_interfaces.type_enums import MetricType
|
|
6
|
+
|
|
7
|
+
DERIVED_METRICS = [MetricType.DERIVED, MetricType.RATIO]
|
|
8
|
+
BASE_METRICS = [MetricType.SIMPLE, MetricType.CUMULATIVE, MetricType.CONVERSION]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MetricReference(object):
|
|
12
|
+
def __init__(self, metric_name, package_name=None) -> None:
|
|
13
|
+
self.metric_name = metric_name
|
|
14
|
+
self.package_name = package_name
|
|
15
|
+
|
|
16
|
+
def __str__(self):
|
|
17
|
+
return f"{self.metric_name}"
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ResolvedMetricReference(MetricReference):
|
|
21
|
+
"""
|
|
22
|
+
Simple proxy over a Metric which delegates property
|
|
23
|
+
lookups to the underlying node. Also adds helper functions
|
|
24
|
+
for working with metrics (ie. __str__ and templating functions)
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
def __init__(self, node: Metric, manifest: Manifest) -> None:
|
|
28
|
+
super().__init__(node.name, node.package_name)
|
|
29
|
+
self.node = node
|
|
30
|
+
self.manifest = manifest
|
|
31
|
+
|
|
32
|
+
def __getattr__(self, key) -> Any:
|
|
33
|
+
return getattr(self.node, key)
|
|
34
|
+
|
|
35
|
+
def __str__(self) -> str:
|
|
36
|
+
return f"{self.node.name}"
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def parent_metrics(cls, metric_node: Metric, manifest: Manifest) -> Iterator[Metric]:
|
|
40
|
+
"""For a given metric, yeilds all upstream metrics."""
|
|
41
|
+
yield metric_node
|
|
42
|
+
|
|
43
|
+
for parent_unique_id in metric_node.depends_on.nodes:
|
|
44
|
+
node = manifest.expect(parent_unique_id)
|
|
45
|
+
if isinstance(node, Metric):
|
|
46
|
+
yield from cls.parent_metrics(node, manifest)
|
|
47
|
+
|
|
48
|
+
@classmethod
|
|
49
|
+
def parent_metrics_names(cls, metric_node: Metric, manifest: Manifest) -> Iterator[str]:
|
|
50
|
+
"""For a given metric, yeilds all upstream metric names"""
|
|
51
|
+
for metric in cls.parent_metrics(metric_node, manifest):
|
|
52
|
+
yield metric.name
|
|
53
|
+
|
|
54
|
+
@classmethod
|
|
55
|
+
def reverse_dag_parsing(
|
|
56
|
+
cls, metric_node: Metric, manifest: Manifest, metric_depth_count: int
|
|
57
|
+
) -> Iterator[Dict[str, int]]:
|
|
58
|
+
"""For the given metric, yeilds dictionaries having {<metric_name>: <depth_from_initial_metric} of upstream derived metrics.
|
|
59
|
+
|
|
60
|
+
This function is intended as a helper function for other metric helper functions.
|
|
61
|
+
"""
|
|
62
|
+
if metric_node.type in DERIVED_METRICS:
|
|
63
|
+
yield {metric_node.name: metric_depth_count}
|
|
64
|
+
|
|
65
|
+
for parent_unique_id in metric_node.depends_on.nodes:
|
|
66
|
+
node = manifest.expect(parent_unique_id)
|
|
67
|
+
if isinstance(node, Metric):
|
|
68
|
+
yield from cls.reverse_dag_parsing(node, manifest, metric_depth_count + 1)
|
|
69
|
+
|
|
70
|
+
def full_metric_dependency(self):
|
|
71
|
+
"""Returns a unique list of all upstream metric names."""
|
|
72
|
+
to_return = list(set(self.parent_metrics_names(self.node, self.manifest)))
|
|
73
|
+
return to_return
|
|
74
|
+
|
|
75
|
+
def base_metric_dependency(self) -> List[str]:
|
|
76
|
+
"""Returns a unique list of names for all upstream non-derived metrics."""
|
|
77
|
+
in_scope_metrics = list(self.parent_metrics(self.node, self.manifest))
|
|
78
|
+
base_metrics = {
|
|
79
|
+
metric.name for metric in in_scope_metrics if metric.type not in DERIVED_METRICS
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return list(base_metrics)
|
|
83
|
+
|
|
84
|
+
def derived_metric_dependency(self) -> List[str]:
|
|
85
|
+
"""Returns a unique list of names for all upstream derived metrics."""
|
|
86
|
+
in_scope_metrics = list(self.parent_metrics(self.node, self.manifest))
|
|
87
|
+
derived_metrics = {
|
|
88
|
+
metric.name for metric in in_scope_metrics if metric.type in DERIVED_METRICS
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return list(derived_metrics)
|
|
92
|
+
|
|
93
|
+
def derived_metric_dependency_depth(self) -> List[Dict[str, int]]:
|
|
94
|
+
"""Returns a list of {<metric_name>: <depth_from_initial_metric>} for all upstream metrics."""
|
|
95
|
+
metric_depth_count = 1
|
|
96
|
+
to_return = list(self.reverse_dag_parsing(self.node, self.manifest, metric_depth_count))
|
|
97
|
+
|
|
98
|
+
return to_return
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import Any, Dict, List, Optional, Type
|
|
3
|
+
|
|
4
|
+
from dvt.artifacts.resources import (
|
|
5
|
+
ExposureConfig,
|
|
6
|
+
FunctionConfig,
|
|
7
|
+
GroupConfig,
|
|
8
|
+
MetricConfig,
|
|
9
|
+
ModelConfig,
|
|
10
|
+
NodeConfig,
|
|
11
|
+
SavedQueryConfig,
|
|
12
|
+
SeedConfig,
|
|
13
|
+
SemanticModelConfig,
|
|
14
|
+
SnapshotConfig,
|
|
15
|
+
SourceConfig,
|
|
16
|
+
TestConfig,
|
|
17
|
+
UnitTestConfig,
|
|
18
|
+
)
|
|
19
|
+
from dvt.node_types import NodeType
|
|
20
|
+
|
|
21
|
+
from dbt_common.contracts.config.base import BaseConfig
|
|
22
|
+
from dbt_common.contracts.config.metadata import Metadata
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def metas(*metas: Metadata) -> Dict[str, Any]:
|
|
26
|
+
existing: Dict[str, Any] = {}
|
|
27
|
+
for m in metas:
|
|
28
|
+
existing = m.meta(existing)
|
|
29
|
+
return existing
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def insensitive_patterns(*patterns: str):
|
|
33
|
+
lowercased = []
|
|
34
|
+
for pattern in patterns:
|
|
35
|
+
lowercased.append("".join("[{}{}]".format(s.upper(), s.lower()) for s in pattern))
|
|
36
|
+
return "^({})$".format("|".join(lowercased))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass
|
|
40
|
+
class UnitTestNodeConfig(NodeConfig):
|
|
41
|
+
expected_rows: List[Dict[str, Any]] = field(default_factory=list)
|
|
42
|
+
expected_sql: Optional[str] = None
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
RESOURCE_TYPES: Dict[NodeType, Type[BaseConfig]] = {
|
|
46
|
+
NodeType.Metric: MetricConfig,
|
|
47
|
+
NodeType.SemanticModel: SemanticModelConfig,
|
|
48
|
+
NodeType.SavedQuery: SavedQueryConfig,
|
|
49
|
+
NodeType.Exposure: ExposureConfig,
|
|
50
|
+
NodeType.Source: SourceConfig,
|
|
51
|
+
NodeType.Seed: SeedConfig,
|
|
52
|
+
NodeType.Test: TestConfig,
|
|
53
|
+
NodeType.Model: ModelConfig,
|
|
54
|
+
NodeType.Snapshot: SnapshotConfig,
|
|
55
|
+
NodeType.Unit: UnitTestConfig,
|
|
56
|
+
NodeType.Group: GroupConfig,
|
|
57
|
+
NodeType.Function: FunctionConfig,
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
# base resource types are like resource types, except nothing has mandatory
|
|
62
|
+
# configs.
|
|
63
|
+
BASE_RESOURCE_TYPES: Dict[NodeType, Type[BaseConfig]] = RESOURCE_TYPES.copy()
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def get_config_for(resource_type: NodeType, base=False) -> Type[BaseConfig]:
|
|
67
|
+
if base:
|
|
68
|
+
lookup = BASE_RESOURCE_TYPES
|
|
69
|
+
else:
|
|
70
|
+
lookup = RESOURCE_TYPES
|
|
71
|
+
return lookup.get(resource_type, NodeConfig)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from datetime import datetime, timezone
|
|
3
|
+
from typing import List, Optional
|
|
4
|
+
|
|
5
|
+
from dvt.artifacts.resources import NodeVersion
|
|
6
|
+
from dvt.node_types import AccessType, NodeType
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class ModelNodeArgs:
|
|
11
|
+
name: str
|
|
12
|
+
package_name: str
|
|
13
|
+
identifier: str
|
|
14
|
+
schema: str
|
|
15
|
+
database: Optional[str] = None
|
|
16
|
+
relation_name: Optional[str] = None
|
|
17
|
+
version: Optional[NodeVersion] = None
|
|
18
|
+
latest_version: Optional[NodeVersion] = None
|
|
19
|
+
deprecation_date: Optional[datetime] = None
|
|
20
|
+
access: Optional[str] = AccessType.Protected.value
|
|
21
|
+
generated_at: datetime = field(
|
|
22
|
+
default_factory=lambda: datetime.now(timezone.utc).replace(tzinfo=None)
|
|
23
|
+
)
|
|
24
|
+
depends_on_nodes: List[str] = field(default_factory=list)
|
|
25
|
+
enabled: bool = True
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def unique_id(self) -> str:
|
|
29
|
+
unique_id = f"{NodeType.Model}.{self.package_name}.{self.name}"
|
|
30
|
+
if self.version:
|
|
31
|
+
unique_id = f"{unique_id}.v{self.version}"
|
|
32
|
+
|
|
33
|
+
return unique_id
|
|
34
|
+
|
|
35
|
+
@property
|
|
36
|
+
def fqn(self) -> List[str]:
|
|
37
|
+
fqn = [self.package_name, self.name]
|
|
38
|
+
# Test for None explicitly because version can be 0
|
|
39
|
+
if self.version is not None:
|
|
40
|
+
fqn.append(f"v{self.version}")
|
|
41
|
+
|
|
42
|
+
return fqn
|