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.

Files changed (261) hide show
  1. dvt/__init__.py +7 -0
  2. dvt/_pydantic_shim.py +26 -0
  3. dvt/adapters/__init__.py +16 -0
  4. dvt/adapters/multi_adapter_manager.py +268 -0
  5. dvt/artifacts/__init__.py +0 -0
  6. dvt/artifacts/exceptions/__init__.py +1 -0
  7. dvt/artifacts/exceptions/schemas.py +31 -0
  8. dvt/artifacts/resources/__init__.py +116 -0
  9. dvt/artifacts/resources/base.py +68 -0
  10. dvt/artifacts/resources/types.py +93 -0
  11. dvt/artifacts/resources/v1/analysis.py +10 -0
  12. dvt/artifacts/resources/v1/catalog.py +23 -0
  13. dvt/artifacts/resources/v1/components.py +275 -0
  14. dvt/artifacts/resources/v1/config.py +282 -0
  15. dvt/artifacts/resources/v1/documentation.py +11 -0
  16. dvt/artifacts/resources/v1/exposure.py +52 -0
  17. dvt/artifacts/resources/v1/function.py +53 -0
  18. dvt/artifacts/resources/v1/generic_test.py +32 -0
  19. dvt/artifacts/resources/v1/group.py +22 -0
  20. dvt/artifacts/resources/v1/hook.py +11 -0
  21. dvt/artifacts/resources/v1/macro.py +30 -0
  22. dvt/artifacts/resources/v1/metric.py +173 -0
  23. dvt/artifacts/resources/v1/model.py +146 -0
  24. dvt/artifacts/resources/v1/owner.py +10 -0
  25. dvt/artifacts/resources/v1/saved_query.py +112 -0
  26. dvt/artifacts/resources/v1/seed.py +42 -0
  27. dvt/artifacts/resources/v1/semantic_layer_components.py +72 -0
  28. dvt/artifacts/resources/v1/semantic_model.py +315 -0
  29. dvt/artifacts/resources/v1/singular_test.py +14 -0
  30. dvt/artifacts/resources/v1/snapshot.py +92 -0
  31. dvt/artifacts/resources/v1/source_definition.py +85 -0
  32. dvt/artifacts/resources/v1/sql_operation.py +10 -0
  33. dvt/artifacts/resources/v1/unit_test_definition.py +78 -0
  34. dvt/artifacts/schemas/__init__.py +0 -0
  35. dvt/artifacts/schemas/base.py +191 -0
  36. dvt/artifacts/schemas/batch_results.py +24 -0
  37. dvt/artifacts/schemas/catalog/__init__.py +12 -0
  38. dvt/artifacts/schemas/catalog/v1/__init__.py +0 -0
  39. dvt/artifacts/schemas/catalog/v1/catalog.py +60 -0
  40. dvt/artifacts/schemas/freshness/__init__.py +1 -0
  41. dvt/artifacts/schemas/freshness/v3/__init__.py +0 -0
  42. dvt/artifacts/schemas/freshness/v3/freshness.py +159 -0
  43. dvt/artifacts/schemas/manifest/__init__.py +2 -0
  44. dvt/artifacts/schemas/manifest/v12/__init__.py +0 -0
  45. dvt/artifacts/schemas/manifest/v12/manifest.py +212 -0
  46. dvt/artifacts/schemas/results.py +148 -0
  47. dvt/artifacts/schemas/run/__init__.py +2 -0
  48. dvt/artifacts/schemas/run/v5/__init__.py +0 -0
  49. dvt/artifacts/schemas/run/v5/run.py +184 -0
  50. dvt/artifacts/schemas/upgrades/__init__.py +4 -0
  51. dvt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
  52. dvt/artifacts/schemas/upgrades/upgrade_manifest_dbt_version.py +2 -0
  53. dvt/artifacts/utils/validation.py +153 -0
  54. dvt/cli/__init__.py +1 -0
  55. dvt/cli/context.py +16 -0
  56. dvt/cli/exceptions.py +56 -0
  57. dvt/cli/flags.py +558 -0
  58. dvt/cli/main.py +971 -0
  59. dvt/cli/option_types.py +121 -0
  60. dvt/cli/options.py +79 -0
  61. dvt/cli/params.py +803 -0
  62. dvt/cli/requires.py +478 -0
  63. dvt/cli/resolvers.py +32 -0
  64. dvt/cli/types.py +40 -0
  65. dvt/clients/__init__.py +0 -0
  66. dvt/clients/checked_load.py +82 -0
  67. dvt/clients/git.py +164 -0
  68. dvt/clients/jinja.py +206 -0
  69. dvt/clients/jinja_static.py +245 -0
  70. dvt/clients/registry.py +192 -0
  71. dvt/clients/yaml_helper.py +68 -0
  72. dvt/compilation.py +833 -0
  73. dvt/compute/__init__.py +26 -0
  74. dvt/compute/base.py +288 -0
  75. dvt/compute/engines/__init__.py +13 -0
  76. dvt/compute/engines/duckdb_engine.py +368 -0
  77. dvt/compute/engines/spark_engine.py +273 -0
  78. dvt/compute/query_analyzer.py +212 -0
  79. dvt/compute/router.py +483 -0
  80. dvt/config/__init__.py +4 -0
  81. dvt/config/catalogs.py +95 -0
  82. dvt/config/compute_config.py +406 -0
  83. dvt/config/profile.py +411 -0
  84. dvt/config/profiles_v2.py +464 -0
  85. dvt/config/project.py +893 -0
  86. dvt/config/renderer.py +232 -0
  87. dvt/config/runtime.py +491 -0
  88. dvt/config/selectors.py +209 -0
  89. dvt/config/utils.py +78 -0
  90. dvt/connectors/.gitignore +6 -0
  91. dvt/connectors/README.md +306 -0
  92. dvt/connectors/catalog.yml +217 -0
  93. dvt/connectors/download_connectors.py +300 -0
  94. dvt/constants.py +29 -0
  95. dvt/context/__init__.py +0 -0
  96. dvt/context/base.py +746 -0
  97. dvt/context/configured.py +136 -0
  98. dvt/context/context_config.py +350 -0
  99. dvt/context/docs.py +82 -0
  100. dvt/context/exceptions_jinja.py +179 -0
  101. dvt/context/macro_resolver.py +195 -0
  102. dvt/context/macros.py +171 -0
  103. dvt/context/manifest.py +73 -0
  104. dvt/context/providers.py +2198 -0
  105. dvt/context/query_header.py +14 -0
  106. dvt/context/secret.py +59 -0
  107. dvt/context/target.py +74 -0
  108. dvt/contracts/__init__.py +0 -0
  109. dvt/contracts/files.py +413 -0
  110. dvt/contracts/graph/__init__.py +0 -0
  111. dvt/contracts/graph/manifest.py +1904 -0
  112. dvt/contracts/graph/metrics.py +98 -0
  113. dvt/contracts/graph/model_config.py +71 -0
  114. dvt/contracts/graph/node_args.py +42 -0
  115. dvt/contracts/graph/nodes.py +1806 -0
  116. dvt/contracts/graph/semantic_manifest.py +233 -0
  117. dvt/contracts/graph/unparsed.py +812 -0
  118. dvt/contracts/project.py +417 -0
  119. dvt/contracts/results.py +53 -0
  120. dvt/contracts/selection.py +23 -0
  121. dvt/contracts/sql.py +86 -0
  122. dvt/contracts/state.py +69 -0
  123. dvt/contracts/util.py +46 -0
  124. dvt/deprecations.py +347 -0
  125. dvt/deps/__init__.py +0 -0
  126. dvt/deps/base.py +153 -0
  127. dvt/deps/git.py +196 -0
  128. dvt/deps/local.py +80 -0
  129. dvt/deps/registry.py +131 -0
  130. dvt/deps/resolver.py +149 -0
  131. dvt/deps/tarball.py +121 -0
  132. dvt/docs/source/_ext/dbt_click.py +118 -0
  133. dvt/docs/source/conf.py +32 -0
  134. dvt/env_vars.py +64 -0
  135. dvt/event_time/event_time.py +40 -0
  136. dvt/event_time/sample_window.py +60 -0
  137. dvt/events/__init__.py +16 -0
  138. dvt/events/base_types.py +37 -0
  139. dvt/events/core_types_pb2.py +2 -0
  140. dvt/events/logging.py +109 -0
  141. dvt/events/types.py +2534 -0
  142. dvt/exceptions.py +1487 -0
  143. dvt/flags.py +89 -0
  144. dvt/graph/__init__.py +11 -0
  145. dvt/graph/cli.py +248 -0
  146. dvt/graph/graph.py +172 -0
  147. dvt/graph/queue.py +213 -0
  148. dvt/graph/selector.py +375 -0
  149. dvt/graph/selector_methods.py +976 -0
  150. dvt/graph/selector_spec.py +223 -0
  151. dvt/graph/thread_pool.py +18 -0
  152. dvt/hooks.py +21 -0
  153. dvt/include/README.md +49 -0
  154. dvt/include/__init__.py +3 -0
  155. dvt/include/global_project.py +4 -0
  156. dvt/include/starter_project/.gitignore +4 -0
  157. dvt/include/starter_project/README.md +15 -0
  158. dvt/include/starter_project/__init__.py +3 -0
  159. dvt/include/starter_project/analyses/.gitkeep +0 -0
  160. dvt/include/starter_project/dvt_project.yml +36 -0
  161. dvt/include/starter_project/macros/.gitkeep +0 -0
  162. dvt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
  163. dvt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
  164. dvt/include/starter_project/models/example/schema.yml +21 -0
  165. dvt/include/starter_project/seeds/.gitkeep +0 -0
  166. dvt/include/starter_project/snapshots/.gitkeep +0 -0
  167. dvt/include/starter_project/tests/.gitkeep +0 -0
  168. dvt/internal_deprecations.py +27 -0
  169. dvt/jsonschemas/__init__.py +3 -0
  170. dvt/jsonschemas/jsonschemas.py +309 -0
  171. dvt/jsonschemas/project/0.0.110.json +4717 -0
  172. dvt/jsonschemas/project/0.0.85.json +2015 -0
  173. dvt/jsonschemas/resources/0.0.110.json +2636 -0
  174. dvt/jsonschemas/resources/0.0.85.json +2536 -0
  175. dvt/jsonschemas/resources/latest.json +6773 -0
  176. dvt/links.py +4 -0
  177. dvt/materializations/__init__.py +0 -0
  178. dvt/materializations/incremental/__init__.py +0 -0
  179. dvt/materializations/incremental/microbatch.py +235 -0
  180. dvt/mp_context.py +8 -0
  181. dvt/node_types.py +37 -0
  182. dvt/parser/__init__.py +23 -0
  183. dvt/parser/analysis.py +21 -0
  184. dvt/parser/base.py +549 -0
  185. dvt/parser/common.py +267 -0
  186. dvt/parser/docs.py +52 -0
  187. dvt/parser/fixtures.py +51 -0
  188. dvt/parser/functions.py +30 -0
  189. dvt/parser/generic_test.py +100 -0
  190. dvt/parser/generic_test_builders.py +334 -0
  191. dvt/parser/hooks.py +119 -0
  192. dvt/parser/macros.py +137 -0
  193. dvt/parser/manifest.py +2204 -0
  194. dvt/parser/models.py +574 -0
  195. dvt/parser/partial.py +1179 -0
  196. dvt/parser/read_files.py +445 -0
  197. dvt/parser/schema_generic_tests.py +423 -0
  198. dvt/parser/schema_renderer.py +111 -0
  199. dvt/parser/schema_yaml_readers.py +936 -0
  200. dvt/parser/schemas.py +1467 -0
  201. dvt/parser/search.py +149 -0
  202. dvt/parser/seeds.py +28 -0
  203. dvt/parser/singular_test.py +20 -0
  204. dvt/parser/snapshots.py +44 -0
  205. dvt/parser/sources.py +557 -0
  206. dvt/parser/sql.py +63 -0
  207. dvt/parser/unit_tests.py +622 -0
  208. dvt/plugins/__init__.py +20 -0
  209. dvt/plugins/contracts.py +10 -0
  210. dvt/plugins/exceptions.py +2 -0
  211. dvt/plugins/manager.py +164 -0
  212. dvt/plugins/manifest.py +21 -0
  213. dvt/profiler.py +20 -0
  214. dvt/py.typed +1 -0
  215. dvt/runners/__init__.py +2 -0
  216. dvt/runners/exposure_runner.py +7 -0
  217. dvt/runners/no_op_runner.py +46 -0
  218. dvt/runners/saved_query_runner.py +7 -0
  219. dvt/selected_resources.py +8 -0
  220. dvt/task/__init__.py +0 -0
  221. dvt/task/base.py +504 -0
  222. dvt/task/build.py +197 -0
  223. dvt/task/clean.py +57 -0
  224. dvt/task/clone.py +162 -0
  225. dvt/task/compile.py +151 -0
  226. dvt/task/compute.py +366 -0
  227. dvt/task/debug.py +650 -0
  228. dvt/task/deps.py +280 -0
  229. dvt/task/docs/__init__.py +3 -0
  230. dvt/task/docs/generate.py +408 -0
  231. dvt/task/docs/index.html +250 -0
  232. dvt/task/docs/serve.py +28 -0
  233. dvt/task/freshness.py +323 -0
  234. dvt/task/function.py +122 -0
  235. dvt/task/group_lookup.py +46 -0
  236. dvt/task/init.py +374 -0
  237. dvt/task/list.py +237 -0
  238. dvt/task/printer.py +176 -0
  239. dvt/task/profiles.py +256 -0
  240. dvt/task/retry.py +175 -0
  241. dvt/task/run.py +1146 -0
  242. dvt/task/run_operation.py +142 -0
  243. dvt/task/runnable.py +802 -0
  244. dvt/task/seed.py +104 -0
  245. dvt/task/show.py +150 -0
  246. dvt/task/snapshot.py +57 -0
  247. dvt/task/sql.py +111 -0
  248. dvt/task/test.py +464 -0
  249. dvt/tests/fixtures/__init__.py +1 -0
  250. dvt/tests/fixtures/project.py +620 -0
  251. dvt/tests/util.py +651 -0
  252. dvt/tracking.py +529 -0
  253. dvt/utils/__init__.py +3 -0
  254. dvt/utils/artifact_upload.py +151 -0
  255. dvt/utils/utils.py +408 -0
  256. dvt/version.py +249 -0
  257. dvt_core-1.11.0b4.dist-info/METADATA +252 -0
  258. dvt_core-1.11.0b4.dist-info/RECORD +261 -0
  259. dvt_core-1.11.0b4.dist-info/WHEEL +5 -0
  260. dvt_core-1.11.0b4.dist-info/entry_points.txt +2 -0
  261. 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