dvt-core 0.52.2__cp310-cp310-macosx_10_9_x86_64.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 (275) hide show
  1. dbt/__init__.py +7 -0
  2. dbt/_pydantic_shim.py +26 -0
  3. dbt/artifacts/__init__.py +0 -0
  4. dbt/artifacts/exceptions/__init__.py +1 -0
  5. dbt/artifacts/exceptions/schemas.py +31 -0
  6. dbt/artifacts/resources/__init__.py +116 -0
  7. dbt/artifacts/resources/base.py +67 -0
  8. dbt/artifacts/resources/types.py +93 -0
  9. dbt/artifacts/resources/v1/analysis.py +10 -0
  10. dbt/artifacts/resources/v1/catalog.py +23 -0
  11. dbt/artifacts/resources/v1/components.py +274 -0
  12. dbt/artifacts/resources/v1/config.py +277 -0
  13. dbt/artifacts/resources/v1/documentation.py +11 -0
  14. dbt/artifacts/resources/v1/exposure.py +51 -0
  15. dbt/artifacts/resources/v1/function.py +52 -0
  16. dbt/artifacts/resources/v1/generic_test.py +31 -0
  17. dbt/artifacts/resources/v1/group.py +21 -0
  18. dbt/artifacts/resources/v1/hook.py +11 -0
  19. dbt/artifacts/resources/v1/macro.py +29 -0
  20. dbt/artifacts/resources/v1/metric.py +172 -0
  21. dbt/artifacts/resources/v1/model.py +145 -0
  22. dbt/artifacts/resources/v1/owner.py +10 -0
  23. dbt/artifacts/resources/v1/saved_query.py +111 -0
  24. dbt/artifacts/resources/v1/seed.py +41 -0
  25. dbt/artifacts/resources/v1/semantic_layer_components.py +72 -0
  26. dbt/artifacts/resources/v1/semantic_model.py +314 -0
  27. dbt/artifacts/resources/v1/singular_test.py +14 -0
  28. dbt/artifacts/resources/v1/snapshot.py +91 -0
  29. dbt/artifacts/resources/v1/source_definition.py +84 -0
  30. dbt/artifacts/resources/v1/sql_operation.py +10 -0
  31. dbt/artifacts/resources/v1/unit_test_definition.py +77 -0
  32. dbt/artifacts/schemas/__init__.py +0 -0
  33. dbt/artifacts/schemas/base.py +191 -0
  34. dbt/artifacts/schemas/batch_results.py +24 -0
  35. dbt/artifacts/schemas/catalog/__init__.py +11 -0
  36. dbt/artifacts/schemas/catalog/v1/__init__.py +0 -0
  37. dbt/artifacts/schemas/catalog/v1/catalog.py +59 -0
  38. dbt/artifacts/schemas/freshness/__init__.py +1 -0
  39. dbt/artifacts/schemas/freshness/v3/__init__.py +0 -0
  40. dbt/artifacts/schemas/freshness/v3/freshness.py +158 -0
  41. dbt/artifacts/schemas/manifest/__init__.py +2 -0
  42. dbt/artifacts/schemas/manifest/v12/__init__.py +0 -0
  43. dbt/artifacts/schemas/manifest/v12/manifest.py +211 -0
  44. dbt/artifacts/schemas/results.py +147 -0
  45. dbt/artifacts/schemas/run/__init__.py +2 -0
  46. dbt/artifacts/schemas/run/v5/__init__.py +0 -0
  47. dbt/artifacts/schemas/run/v5/run.py +184 -0
  48. dbt/artifacts/schemas/upgrades/__init__.py +4 -0
  49. dbt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
  50. dbt/artifacts/schemas/upgrades/upgrade_manifest_dbt_version.py +2 -0
  51. dbt/artifacts/utils/validation.py +153 -0
  52. dbt/cli/__init__.py +1 -0
  53. dbt/cli/context.py +17 -0
  54. dbt/cli/exceptions.py +57 -0
  55. dbt/cli/flags.py +560 -0
  56. dbt/cli/main.py +2039 -0
  57. dbt/cli/option_types.py +121 -0
  58. dbt/cli/options.py +80 -0
  59. dbt/cli/params.py +804 -0
  60. dbt/cli/requires.py +490 -0
  61. dbt/cli/resolvers.py +50 -0
  62. dbt/cli/types.py +40 -0
  63. dbt/clients/__init__.py +0 -0
  64. dbt/clients/checked_load.py +83 -0
  65. dbt/clients/git.py +164 -0
  66. dbt/clients/jinja.py +206 -0
  67. dbt/clients/jinja_static.py +245 -0
  68. dbt/clients/registry.py +192 -0
  69. dbt/clients/yaml_helper.py +68 -0
  70. dbt/compilation.py +876 -0
  71. dbt/compute/__init__.py +14 -0
  72. dbt/compute/engines/__init__.py +12 -0
  73. dbt/compute/engines/spark_engine.py +624 -0
  74. dbt/compute/federated_executor.py +837 -0
  75. dbt/compute/filter_pushdown.cpython-310-darwin.so +0 -0
  76. dbt/compute/filter_pushdown.py +273 -0
  77. dbt/compute/jar_provisioning.cpython-310-darwin.so +0 -0
  78. dbt/compute/jar_provisioning.py +255 -0
  79. dbt/compute/java_compat.cpython-310-darwin.so +0 -0
  80. dbt/compute/java_compat.py +689 -0
  81. dbt/compute/jdbc_utils.cpython-310-darwin.so +0 -0
  82. dbt/compute/jdbc_utils.py +678 -0
  83. dbt/compute/smart_selector.cpython-310-darwin.so +0 -0
  84. dbt/compute/smart_selector.py +311 -0
  85. dbt/compute/strategies/__init__.py +54 -0
  86. dbt/compute/strategies/base.py +165 -0
  87. dbt/compute/strategies/dataproc.py +207 -0
  88. dbt/compute/strategies/emr.py +203 -0
  89. dbt/compute/strategies/local.py +364 -0
  90. dbt/compute/strategies/standalone.py +262 -0
  91. dbt/config/__init__.py +4 -0
  92. dbt/config/catalogs.py +94 -0
  93. dbt/config/compute.cpython-310-darwin.so +0 -0
  94. dbt/config/compute.py +547 -0
  95. dbt/config/dvt_profile.cpython-310-darwin.so +0 -0
  96. dbt/config/dvt_profile.py +342 -0
  97. dbt/config/profile.py +422 -0
  98. dbt/config/project.py +873 -0
  99. dbt/config/project_utils.py +28 -0
  100. dbt/config/renderer.py +231 -0
  101. dbt/config/runtime.py +553 -0
  102. dbt/config/selectors.py +208 -0
  103. dbt/config/utils.py +77 -0
  104. dbt/constants.py +28 -0
  105. dbt/context/__init__.py +0 -0
  106. dbt/context/base.py +745 -0
  107. dbt/context/configured.py +135 -0
  108. dbt/context/context_config.py +382 -0
  109. dbt/context/docs.py +82 -0
  110. dbt/context/exceptions_jinja.py +178 -0
  111. dbt/context/macro_resolver.py +195 -0
  112. dbt/context/macros.py +171 -0
  113. dbt/context/manifest.py +72 -0
  114. dbt/context/providers.py +2249 -0
  115. dbt/context/query_header.py +13 -0
  116. dbt/context/secret.py +58 -0
  117. dbt/context/target.py +74 -0
  118. dbt/contracts/__init__.py +0 -0
  119. dbt/contracts/files.py +413 -0
  120. dbt/contracts/graph/__init__.py +0 -0
  121. dbt/contracts/graph/manifest.py +1904 -0
  122. dbt/contracts/graph/metrics.py +97 -0
  123. dbt/contracts/graph/model_config.py +70 -0
  124. dbt/contracts/graph/node_args.py +42 -0
  125. dbt/contracts/graph/nodes.py +1806 -0
  126. dbt/contracts/graph/semantic_manifest.py +232 -0
  127. dbt/contracts/graph/unparsed.py +811 -0
  128. dbt/contracts/project.py +417 -0
  129. dbt/contracts/results.py +53 -0
  130. dbt/contracts/selection.py +23 -0
  131. dbt/contracts/sql.py +85 -0
  132. dbt/contracts/state.py +68 -0
  133. dbt/contracts/util.py +46 -0
  134. dbt/deprecations.py +346 -0
  135. dbt/deps/__init__.py +0 -0
  136. dbt/deps/base.py +152 -0
  137. dbt/deps/git.py +195 -0
  138. dbt/deps/local.py +79 -0
  139. dbt/deps/registry.py +130 -0
  140. dbt/deps/resolver.py +149 -0
  141. dbt/deps/tarball.py +120 -0
  142. dbt/docs/source/_ext/dbt_click.py +119 -0
  143. dbt/docs/source/conf.py +32 -0
  144. dbt/env_vars.py +64 -0
  145. dbt/event_time/event_time.py +40 -0
  146. dbt/event_time/sample_window.py +60 -0
  147. dbt/events/__init__.py +15 -0
  148. dbt/events/base_types.py +36 -0
  149. dbt/events/core_types_pb2.py +2 -0
  150. dbt/events/logging.py +108 -0
  151. dbt/events/types.py +2516 -0
  152. dbt/exceptions.py +1486 -0
  153. dbt/flags.py +89 -0
  154. dbt/graph/__init__.py +11 -0
  155. dbt/graph/cli.py +247 -0
  156. dbt/graph/graph.py +172 -0
  157. dbt/graph/queue.py +214 -0
  158. dbt/graph/selector.py +374 -0
  159. dbt/graph/selector_methods.py +975 -0
  160. dbt/graph/selector_spec.py +222 -0
  161. dbt/graph/thread_pool.py +18 -0
  162. dbt/hooks.py +21 -0
  163. dbt/include/README.md +49 -0
  164. dbt/include/__init__.py +3 -0
  165. dbt/include/starter_project/.gitignore +4 -0
  166. dbt/include/starter_project/README.md +15 -0
  167. dbt/include/starter_project/__init__.py +3 -0
  168. dbt/include/starter_project/analyses/.gitkeep +0 -0
  169. dbt/include/starter_project/dbt_project.yml +36 -0
  170. dbt/include/starter_project/macros/.gitkeep +0 -0
  171. dbt/include/starter_project/models/example/my_first_dbt_model.sql +27 -0
  172. dbt/include/starter_project/models/example/my_second_dbt_model.sql +6 -0
  173. dbt/include/starter_project/models/example/schema.yml +21 -0
  174. dbt/include/starter_project/seeds/.gitkeep +0 -0
  175. dbt/include/starter_project/snapshots/.gitkeep +0 -0
  176. dbt/include/starter_project/tests/.gitkeep +0 -0
  177. dbt/internal_deprecations.py +26 -0
  178. dbt/jsonschemas/__init__.py +3 -0
  179. dbt/jsonschemas/jsonschemas.py +309 -0
  180. dbt/jsonschemas/project/0.0.110.json +4717 -0
  181. dbt/jsonschemas/project/0.0.85.json +2015 -0
  182. dbt/jsonschemas/resources/0.0.110.json +2636 -0
  183. dbt/jsonschemas/resources/0.0.85.json +2536 -0
  184. dbt/jsonschemas/resources/latest.json +6773 -0
  185. dbt/links.py +4 -0
  186. dbt/materializations/__init__.py +0 -0
  187. dbt/materializations/incremental/__init__.py +0 -0
  188. dbt/materializations/incremental/microbatch.py +236 -0
  189. dbt/mp_context.py +8 -0
  190. dbt/node_types.py +37 -0
  191. dbt/parser/__init__.py +23 -0
  192. dbt/parser/analysis.py +21 -0
  193. dbt/parser/base.py +548 -0
  194. dbt/parser/common.py +266 -0
  195. dbt/parser/docs.py +52 -0
  196. dbt/parser/fixtures.py +51 -0
  197. dbt/parser/functions.py +30 -0
  198. dbt/parser/generic_test.py +100 -0
  199. dbt/parser/generic_test_builders.py +333 -0
  200. dbt/parser/hooks.py +118 -0
  201. dbt/parser/macros.py +137 -0
  202. dbt/parser/manifest.py +2204 -0
  203. dbt/parser/models.py +573 -0
  204. dbt/parser/partial.py +1178 -0
  205. dbt/parser/read_files.py +445 -0
  206. dbt/parser/schema_generic_tests.py +422 -0
  207. dbt/parser/schema_renderer.py +111 -0
  208. dbt/parser/schema_yaml_readers.py +935 -0
  209. dbt/parser/schemas.py +1466 -0
  210. dbt/parser/search.py +149 -0
  211. dbt/parser/seeds.py +28 -0
  212. dbt/parser/singular_test.py +20 -0
  213. dbt/parser/snapshots.py +44 -0
  214. dbt/parser/sources.py +558 -0
  215. dbt/parser/sql.py +62 -0
  216. dbt/parser/unit_tests.py +621 -0
  217. dbt/plugins/__init__.py +20 -0
  218. dbt/plugins/contracts.py +9 -0
  219. dbt/plugins/exceptions.py +2 -0
  220. dbt/plugins/manager.py +163 -0
  221. dbt/plugins/manifest.py +21 -0
  222. dbt/profiler.py +20 -0
  223. dbt/py.typed +1 -0
  224. dbt/query_analyzer.cpython-310-darwin.so +0 -0
  225. dbt/query_analyzer.py +410 -0
  226. dbt/runners/__init__.py +2 -0
  227. dbt/runners/exposure_runner.py +7 -0
  228. dbt/runners/no_op_runner.py +45 -0
  229. dbt/runners/saved_query_runner.py +7 -0
  230. dbt/selected_resources.py +8 -0
  231. dbt/task/__init__.py +0 -0
  232. dbt/task/base.py +503 -0
  233. dbt/task/build.py +197 -0
  234. dbt/task/clean.py +56 -0
  235. dbt/task/clone.py +161 -0
  236. dbt/task/compile.py +150 -0
  237. dbt/task/compute.py +454 -0
  238. dbt/task/debug.py +505 -0
  239. dbt/task/deps.py +280 -0
  240. dbt/task/docs/__init__.py +3 -0
  241. dbt/task/docs/generate.py +660 -0
  242. dbt/task/docs/index.html +250 -0
  243. dbt/task/docs/serve.py +29 -0
  244. dbt/task/freshness.py +322 -0
  245. dbt/task/function.py +121 -0
  246. dbt/task/group_lookup.py +46 -0
  247. dbt/task/init.py +553 -0
  248. dbt/task/java.py +316 -0
  249. dbt/task/list.py +236 -0
  250. dbt/task/printer.py +175 -0
  251. dbt/task/retry.py +175 -0
  252. dbt/task/run.py +1306 -0
  253. dbt/task/run_operation.py +141 -0
  254. dbt/task/runnable.py +758 -0
  255. dbt/task/seed.py +103 -0
  256. dbt/task/show.py +149 -0
  257. dbt/task/snapshot.py +56 -0
  258. dbt/task/spark.py +414 -0
  259. dbt/task/sql.py +110 -0
  260. dbt/task/target_sync.py +759 -0
  261. dbt/task/test.py +464 -0
  262. dbt/tests/fixtures/__init__.py +1 -0
  263. dbt/tests/fixtures/project.py +620 -0
  264. dbt/tests/util.py +651 -0
  265. dbt/tracking.py +529 -0
  266. dbt/utils/__init__.py +3 -0
  267. dbt/utils/artifact_upload.py +151 -0
  268. dbt/utils/utils.py +408 -0
  269. dbt/version.py +268 -0
  270. dvt_cli/__init__.py +72 -0
  271. dvt_core-0.52.2.dist-info/METADATA +286 -0
  272. dvt_core-0.52.2.dist-info/RECORD +275 -0
  273. dvt_core-0.52.2.dist-info/WHEEL +5 -0
  274. dvt_core-0.52.2.dist-info/entry_points.txt +2 -0
  275. dvt_core-0.52.2.dist-info/top_level.txt +2 -0
dbt/task/printer.py ADDED
@@ -0,0 +1,175 @@
1
+ from typing import Dict, Optional, Union
2
+
3
+ from dbt.artifacts.schemas.results import NodeStatus
4
+ from dbt.contracts.graph.nodes import Exposure
5
+ from dbt.events.types import (
6
+ CheckNodeTestFailure,
7
+ EndOfRunSummary,
8
+ RunResultError,
9
+ RunResultErrorNoMessage,
10
+ RunResultFailure,
11
+ RunResultWarning,
12
+ RunResultWarningMessage,
13
+ SQLCompiledPath,
14
+ StatsLine,
15
+ )
16
+ from dbt.node_types import NodeType
17
+ from dbt.task import group_lookup
18
+ from dbt_common.events.base_types import EventLevel
19
+ from dbt_common.events.format import pluralize
20
+ from dbt_common.events.functions import fire_event
21
+ from dbt_common.events.types import Formatting
22
+
23
+
24
+ def get_counts(flat_nodes) -> str:
25
+ counts: Dict[str, int] = {}
26
+
27
+ for node in flat_nodes:
28
+ t = node.resource_type
29
+
30
+ if node.resource_type == NodeType.Model:
31
+ t = "{} {}".format(node.get_materialization(), t)
32
+ elif node.resource_type == NodeType.Operation:
33
+ t = "project hook"
34
+
35
+ counts[t] = counts.get(t, 0) + 1
36
+
37
+ sorted_items = sorted(counts.items(), key=lambda x: x[0])
38
+ stat_line = ", ".join([pluralize(v, k).replace("_", " ") for k, v in sorted_items])
39
+
40
+ return stat_line
41
+
42
+
43
+ def interpret_run_result(result) -> str:
44
+ if result.status in (NodeStatus.Error, NodeStatus.Fail, NodeStatus.PartialSuccess):
45
+ return "error"
46
+ elif result.status == NodeStatus.Skipped:
47
+ return "skip"
48
+ elif result.status == NodeStatus.Warn:
49
+ return "warn"
50
+ elif result.status in (NodeStatus.Pass, NodeStatus.Success):
51
+ return "pass"
52
+ elif result.status == NodeStatus.NoOp:
53
+ return "noop"
54
+ else:
55
+ raise RuntimeError(f"unhandled result {result}")
56
+
57
+
58
+ def print_run_status_line(results) -> None:
59
+ stats = {
60
+ "error": 0,
61
+ "skip": 0,
62
+ "pass": 0,
63
+ "warn": 0,
64
+ "noop": 0,
65
+ "total": 0,
66
+ }
67
+
68
+ for r in results:
69
+ result_type = interpret_run_result(r)
70
+ stats[result_type] += 1
71
+ stats["total"] += 1
72
+
73
+ fire_event(Formatting(""))
74
+ fire_event(StatsLine(stats=stats))
75
+
76
+
77
+ def print_run_result_error(
78
+ result,
79
+ newline: bool = True,
80
+ is_warning: bool = False,
81
+ group: Optional[Dict[str, Union[str, Dict[str, str]]]] = None,
82
+ ) -> None:
83
+ # set node_info for logging events
84
+ node_info = None
85
+ if hasattr(result, "node") and result.node:
86
+ node_info = result.node.node_info
87
+ if result.status in (NodeStatus.Fail, NodeStatus.Error) or (
88
+ is_warning and result.status == NodeStatus.Warn
89
+ ):
90
+ if newline:
91
+ fire_event(Formatting(""))
92
+ if is_warning:
93
+ fire_event(
94
+ RunResultWarning(
95
+ resource_type=result.node.resource_type,
96
+ node_name=result.node.name,
97
+ path=result.node.original_file_path,
98
+ node_info=node_info,
99
+ group=group,
100
+ )
101
+ )
102
+ else:
103
+ fire_event(
104
+ RunResultFailure(
105
+ resource_type=result.node.resource_type,
106
+ node_name=result.node.name,
107
+ path=result.node.original_file_path,
108
+ node_info=node_info,
109
+ group=group,
110
+ )
111
+ )
112
+
113
+ if result.message:
114
+ if is_warning:
115
+ fire_event(RunResultWarningMessage(msg=result.message, node_info=node_info))
116
+ else:
117
+ fire_event(RunResultError(msg=result.message, node_info=node_info, group=group))
118
+ else:
119
+ fire_event(RunResultErrorNoMessage(status=result.status, node_info=node_info))
120
+
121
+ if getattr(result.node, "compiled_path", None):
122
+ fire_event(Formatting(""))
123
+ fire_event(SQLCompiledPath(path=result.node.compiled_path, node_info=node_info))
124
+
125
+ if getattr(result.node, "should_store_failures", None):
126
+ fire_event(Formatting(""))
127
+ fire_event(
128
+ CheckNodeTestFailure(relation_name=result.node.relation_name, node_info=node_info)
129
+ )
130
+ elif result.status == NodeStatus.Skipped and result.message is not None:
131
+ if newline:
132
+ fire_event(Formatting(""), level=EventLevel.DEBUG)
133
+ fire_event(RunResultError(msg=result.message), level=EventLevel.DEBUG)
134
+ elif result.message is not None:
135
+ if newline:
136
+ fire_event(Formatting(""))
137
+ fire_event(RunResultError(msg=result.message, node_info=node_info, group=group))
138
+
139
+
140
+ def print_run_end_messages(results, keyboard_interrupt: bool = False) -> None:
141
+ errors, warnings, partial_successes = [], [], []
142
+ for r in results:
143
+ if r.status in (NodeStatus.RuntimeErr, NodeStatus.Error, NodeStatus.Fail):
144
+ errors.append(r)
145
+ elif r.status == NodeStatus.Skipped and r.message:
146
+ if isinstance(r.node, Exposure):
147
+ # Don't include exposure skips in errors list
148
+ continue
149
+ else:
150
+ # This means we skipped a node because of an issue upstream, so include it as an error
151
+ errors.append(r)
152
+ elif r.status == NodeStatus.Warn:
153
+ warnings.append(r)
154
+ elif r.status == NodeStatus.PartialSuccess:
155
+ partial_successes.append(r)
156
+
157
+ fire_event(Formatting(""))
158
+ fire_event(
159
+ EndOfRunSummary(
160
+ num_errors=len(errors),
161
+ num_warnings=len(warnings),
162
+ num_partial_success=len(partial_successes),
163
+ keyboard_interrupt=keyboard_interrupt,
164
+ )
165
+ )
166
+
167
+ for error in errors:
168
+ group = group_lookup.get(error.node.unique_id) if hasattr(error, "node") else None
169
+ print_run_result_error(error, is_warning=False, group=group)
170
+
171
+ for warning in warnings:
172
+ group = group_lookup.get(warning.node.unique_id) if hasattr(warning, "node") else None
173
+ print_run_result_error(warning, is_warning=True, group=group)
174
+
175
+ print_run_status_line(results)
dbt/task/retry.py ADDED
@@ -0,0 +1,175 @@
1
+ from pathlib import Path
2
+
3
+ from click import get_current_context
4
+ from click.core import ParameterSource
5
+
6
+ from dbt.artifacts.schemas.results import NodeStatus
7
+ from dbt.cli.flags import Flags
8
+ from dbt.cli.types import Command as CliCommand
9
+ from dbt.config import RuntimeConfig
10
+ from dbt.constants import RUN_RESULTS_FILE_NAME
11
+ from dbt.contracts.state import load_result_state
12
+ from dbt.flags import get_flags, set_flags
13
+ from dbt.graph import GraphQueue
14
+ from dbt.parser.manifest import parse_manifest
15
+ from dbt.task.base import ConfiguredTask
16
+ from dbt.task.build import BuildTask
17
+ from dbt.task.clone import CloneTask
18
+ from dbt.task.compile import CompileTask
19
+ from dbt.task.docs.generate import GenerateTask
20
+ from dbt.task.run import RunTask
21
+ from dbt.task.run_operation import RunOperationTask
22
+ from dbt.task.seed import SeedTask
23
+ from dbt.task.snapshot import SnapshotTask
24
+ from dbt.task.test import TestTask
25
+ from dbt_common.exceptions import DbtRuntimeError
26
+
27
+ RETRYABLE_STATUSES = {
28
+ NodeStatus.Error,
29
+ NodeStatus.Fail,
30
+ NodeStatus.Skipped,
31
+ NodeStatus.RuntimeErr,
32
+ NodeStatus.PartialSuccess,
33
+ }
34
+ IGNORE_PARENT_FLAGS = {
35
+ "log_path",
36
+ "output_path",
37
+ "profiles_dir",
38
+ "profiles_dir_exists_false",
39
+ "project_dir",
40
+ "defer_state",
41
+ "deprecated_state",
42
+ "target_path",
43
+ "warn_error",
44
+ }
45
+
46
+ ALLOW_CLI_OVERRIDE_FLAGS = {"vars", "threads"}
47
+
48
+ TASK_DICT = {
49
+ "build": BuildTask,
50
+ "compile": CompileTask,
51
+ "clone": CloneTask,
52
+ "generate": GenerateTask,
53
+ "seed": SeedTask,
54
+ "snapshot": SnapshotTask,
55
+ "test": TestTask,
56
+ "run": RunTask,
57
+ "run-operation": RunOperationTask,
58
+ }
59
+
60
+ CMD_DICT = {
61
+ "build": CliCommand.BUILD,
62
+ "compile": CliCommand.COMPILE,
63
+ "clone": CliCommand.CLONE,
64
+ "generate": CliCommand.DOCS_GENERATE,
65
+ "seed": CliCommand.SEED,
66
+ "snapshot": CliCommand.SNAPSHOT,
67
+ "test": CliCommand.TEST,
68
+ "run": CliCommand.RUN,
69
+ "run-operation": CliCommand.RUN_OPERATION,
70
+ }
71
+
72
+
73
+ class RetryTask(ConfiguredTask):
74
+ def __init__(self, args: Flags, config: RuntimeConfig) -> None:
75
+ # load previous run results
76
+ state_path = args.state or config.target_path
77
+ self.previous_results = load_result_state(
78
+ Path(config.project_root) / Path(state_path) / RUN_RESULTS_FILE_NAME
79
+ )
80
+ if not self.previous_results:
81
+ raise DbtRuntimeError(
82
+ f"Could not find previous run in '{state_path}' target directory"
83
+ )
84
+ self.previous_args = self.previous_results.args
85
+ self.previous_command_name = self.previous_args.get("which")
86
+
87
+ # Reslove flags and config
88
+ if args.warn_error:
89
+ RETRYABLE_STATUSES.add(NodeStatus.Warn)
90
+
91
+ cli_command = CMD_DICT.get(self.previous_command_name) # type: ignore
92
+ # Remove these args when their default values are present, otherwise they'll raise an exception
93
+ args_to_remove = {
94
+ "show": lambda x: True,
95
+ "resource_types": lambda x: x == [],
96
+ "warn_error_options": lambda x: x == {"warn": [], "error": [], "silence": []},
97
+ }
98
+ for k, v in args_to_remove.items():
99
+ if k in self.previous_args and v(self.previous_args[k]):
100
+ del self.previous_args[k]
101
+ previous_args = {
102
+ k: v for k, v in self.previous_args.items() if k not in IGNORE_PARENT_FLAGS
103
+ }
104
+ click_context = get_current_context()
105
+ current_args = {
106
+ k: v
107
+ for k, v in args.__dict__.items()
108
+ if k in IGNORE_PARENT_FLAGS
109
+ or (
110
+ click_context.get_parameter_source(k) == ParameterSource.COMMANDLINE
111
+ and k in ALLOW_CLI_OVERRIDE_FLAGS
112
+ )
113
+ }
114
+ combined_args = {**previous_args, **current_args}
115
+ retry_flags = Flags.from_dict(cli_command, combined_args) # type: ignore
116
+ set_flags(retry_flags)
117
+ retry_config = RuntimeConfig.from_args(args=retry_flags)
118
+
119
+ # Parse manifest using resolved config/flags
120
+ manifest = parse_manifest(retry_config, False, True, retry_flags.write_json, []) # type: ignore
121
+ super().__init__(args, retry_config, manifest)
122
+ self.task_class = TASK_DICT.get(self.previous_command_name) # type: ignore
123
+
124
+ def run(self):
125
+ unique_ids = {
126
+ result.unique_id
127
+ for result in self.previous_results.results
128
+ if result.status in RETRYABLE_STATUSES
129
+ and not (
130
+ self.previous_command_name != "run-operation"
131
+ and result.unique_id.startswith("operation.")
132
+ )
133
+ }
134
+
135
+ # We need this so that re-running of a microbatch model will only rerun
136
+ # batches that previously failed. Note _explicitly_ do no pass the
137
+ # batch info if there were _no_ successful batches previously. This is
138
+ # because passing the batch info _forces_ the microbatch process into
139
+ # _incremental_ model, and it may be that we need to be in full refresh
140
+ # mode which is only handled if previous_batch_results _isn't_ passed for a node
141
+ batch_map = {
142
+ result.unique_id: result.batch_results
143
+ for result in self.previous_results.results
144
+ if result.batch_results is not None
145
+ and len(result.batch_results.successful) != 0
146
+ and len(result.batch_results.failed) > 0
147
+ and not (
148
+ self.previous_command_name != "run-operation"
149
+ and result.unique_id.startswith("operation.")
150
+ )
151
+ }
152
+
153
+ class TaskWrapper(self.task_class):
154
+ def get_graph_queue(self):
155
+ new_graph = self.graph.get_subset_graph(unique_ids)
156
+ return GraphQueue(
157
+ new_graph.graph,
158
+ self.manifest,
159
+ unique_ids,
160
+ )
161
+
162
+ task = TaskWrapper(
163
+ get_flags(),
164
+ self.config,
165
+ self.manifest,
166
+ )
167
+
168
+ if self.task_class == RunTask:
169
+ task.batch_map = batch_map
170
+
171
+ return_value = task.run()
172
+ return return_value
173
+
174
+ def interpret_results(self, *args, **kwargs):
175
+ return self.task_class.interpret_results(*args, **kwargs)