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/seed.py ADDED
@@ -0,0 +1,103 @@
1
+ import random
2
+ from typing import Optional, Type
3
+
4
+ from dbt.artifacts.schemas.results import NodeStatus, RunStatus
5
+ from dbt.contracts.graph.manifest import Manifest
6
+ from dbt.events.types import LogSeedResult, LogStartLine, SeedHeader
7
+ from dbt.graph import ResourceTypeSelector
8
+ from dbt.node_types import NodeType
9
+ from dbt.task import group_lookup
10
+ from dbt.task.base import BaseRunner
11
+ from dbt.task.printer import print_run_end_messages
12
+ from dbt.task.run import ModelRunner, RunTask
13
+ from dbt_common.events.base_types import EventLevel
14
+ from dbt_common.events.functions import fire_event
15
+ from dbt_common.events.types import Formatting
16
+ from dbt_common.exceptions import DbtInternalError
17
+
18
+
19
+ class SeedRunner(ModelRunner):
20
+ def describe_node(self) -> str:
21
+ return "seed file {}".format(self.get_node_representation())
22
+
23
+ def before_execute(self) -> None:
24
+ fire_event(
25
+ LogStartLine(
26
+ description=self.describe_node(),
27
+ index=self.node_index,
28
+ total=self.num_nodes,
29
+ node_info=self.node.node_info,
30
+ )
31
+ )
32
+
33
+ def _build_run_model_result(self, model, context):
34
+ result = super()._build_run_model_result(model, context)
35
+ agate_result = context["load_result"]("agate_table")
36
+ result.agate_table = agate_result.table
37
+ return result
38
+
39
+ def compile(self, manifest: Manifest):
40
+ return self.node
41
+
42
+ def print_result_line(self, result):
43
+ model = result.node
44
+ group = group_lookup.get(model.unique_id)
45
+ level = EventLevel.ERROR if result.status == NodeStatus.Error else EventLevel.INFO
46
+ fire_event(
47
+ LogSeedResult(
48
+ status=result.status,
49
+ result_message=result.message,
50
+ index=self.node_index,
51
+ total=self.num_nodes,
52
+ execution_time=result.execution_time,
53
+ schema=self.node.schema,
54
+ relation=model.alias,
55
+ node_info=model.node_info,
56
+ group=group,
57
+ ),
58
+ level=level,
59
+ )
60
+
61
+
62
+ class SeedTask(RunTask):
63
+ def raise_on_first_error(self) -> bool:
64
+ return False
65
+
66
+ def get_node_selector(self):
67
+ if self.manifest is None or self.graph is None:
68
+ raise DbtInternalError("manifest and graph must be set to get perform node selection")
69
+ return ResourceTypeSelector(
70
+ graph=self.graph,
71
+ manifest=self.manifest,
72
+ previous_state=self.previous_state,
73
+ resource_types=[NodeType.Seed],
74
+ )
75
+
76
+ def get_runner_type(self, _) -> Optional[Type[BaseRunner]]:
77
+ return SeedRunner
78
+
79
+ def task_end_messages(self, results) -> None:
80
+ if self.args.show:
81
+ self.show_tables(results)
82
+
83
+ print_run_end_messages(results)
84
+
85
+ def show_table(self, result):
86
+ table = result.agate_table
87
+ rand_table = table.order_by(lambda x: random.random())
88
+
89
+ schema = result.node.schema
90
+ alias = result.node.alias
91
+
92
+ header = "Random sample of table: {}.{}".format(schema, alias)
93
+ fire_event(Formatting(""))
94
+ fire_event(SeedHeader(header=header))
95
+ fire_event(Formatting("-" * len(header)))
96
+
97
+ rand_table.print_table(max_rows=10, max_columns=None)
98
+ fire_event(Formatting(""))
99
+
100
+ def show_tables(self, results):
101
+ for result in results:
102
+ if result.status != RunStatus.Error:
103
+ self.show_table(result)
dbt/task/show.py ADDED
@@ -0,0 +1,149 @@
1
+ import io
2
+ import threading
3
+ import time
4
+
5
+ from dbt.adapters.factory import get_adapter
6
+ from dbt.artifacts.schemas.run import RunResult, RunStatus
7
+ from dbt.context.providers import generate_runtime_model_context
8
+ from dbt.contracts.graph.nodes import SeedNode
9
+ from dbt.events.types import ShowNode
10
+ from dbt.flags import get_flags
11
+ from dbt.task.base import ConfiguredTask
12
+ from dbt.task.compile import CompileRunner, CompileTask
13
+ from dbt.task.seed import SeedRunner
14
+ from dbt_common.events.base_types import EventLevel
15
+ from dbt_common.events.functions import fire_event
16
+ from dbt_common.events.types import Note
17
+ from dbt_common.exceptions import DbtRuntimeError
18
+
19
+
20
+ class ShowRunner(CompileRunner):
21
+ def __init__(self, config, adapter, node, node_index, num_nodes) -> None:
22
+ super().__init__(config, adapter, node, node_index, num_nodes)
23
+ self.run_ephemeral_models = True
24
+
25
+ def execute(self, compiled_node, manifest):
26
+ start_time = time.time()
27
+
28
+ # Allow passing in -1 (or any negative number) to get all rows
29
+ limit = None if self.config.args.limit < 0 else self.config.args.limit
30
+
31
+ model_context = generate_runtime_model_context(compiled_node, self.config, manifest)
32
+ compiled_node.compiled_code = self.adapter.execute_macro(
33
+ macro_name="get_show_sql",
34
+ macro_resolver=manifest,
35
+ context_override=model_context,
36
+ kwargs={
37
+ "compiled_code": model_context["compiled_code"],
38
+ "sql_header": model_context["config"].get("sql_header"),
39
+ "limit": limit,
40
+ },
41
+ )
42
+ adapter_response, execute_result = self.adapter.execute(
43
+ compiled_node.compiled_code, fetch=True
44
+ )
45
+
46
+ end_time = time.time()
47
+
48
+ return RunResult(
49
+ node=compiled_node,
50
+ status=RunStatus.Success,
51
+ timing=[],
52
+ thread_id=threading.current_thread().name,
53
+ execution_time=end_time - start_time,
54
+ message=None,
55
+ adapter_response=adapter_response.to_dict(),
56
+ agate_table=execute_result,
57
+ failures=None,
58
+ batch_results=None,
59
+ )
60
+
61
+
62
+ class ShowTask(CompileTask):
63
+ def _runtime_initialize(self):
64
+ if not (self.args.select or getattr(self.args, "inline", None)):
65
+ raise DbtRuntimeError("Either --select or --inline must be passed to show")
66
+ super()._runtime_initialize()
67
+
68
+ def get_runner_type(self, node):
69
+ if isinstance(node, SeedNode):
70
+ return SeedRunner
71
+ else:
72
+ return ShowRunner
73
+
74
+ def task_end_messages(self, results) -> None:
75
+ is_inline = bool(getattr(self.args, "inline", None))
76
+
77
+ if is_inline:
78
+ matched_results = [result for result in results if result.node.name == "inline_query"]
79
+ else:
80
+ matched_results = []
81
+ for result in results:
82
+ if result.node.name in self.selection_arg[0]:
83
+ matched_results.append(result)
84
+ else:
85
+ fire_event(
86
+ Note(msg=f"Excluded node '{result.node.name}' from results"),
87
+ EventLevel.DEBUG,
88
+ )
89
+
90
+ for result in matched_results:
91
+ table = result.agate_table
92
+
93
+ # Hack to get Agate table output as string
94
+ output = io.StringIO()
95
+ if self.args.output == "json":
96
+ table.to_json(path=output)
97
+ else:
98
+ table.print_table(output=output, max_rows=None)
99
+
100
+ node_name = result.node.name
101
+
102
+ if hasattr(result.node, "version") and result.node.version:
103
+ node_name += f".v{result.node.version}"
104
+
105
+ fire_event(
106
+ ShowNode(
107
+ node_name=node_name,
108
+ preview=output.getvalue(),
109
+ is_inline=is_inline,
110
+ output_format=self.args.output,
111
+ unique_id=result.node.unique_id,
112
+ quiet=get_flags().QUIET,
113
+ )
114
+ )
115
+
116
+ def _handle_result(self, result) -> None:
117
+ super()._handle_result(result)
118
+
119
+ if (
120
+ result.node.is_ephemeral_model
121
+ and type(self) is ShowTask
122
+ and (self.args.select or getattr(self.args, "inline", None))
123
+ ):
124
+ self.node_results.append(result)
125
+
126
+
127
+ class ShowTaskDirect(ConfiguredTask):
128
+ def run(self):
129
+ adapter = get_adapter(self.config)
130
+ with adapter.connection_named("show", should_release_connection=False):
131
+ limit = None if self.args.limit < 0 else self.args.limit
132
+ response, table = adapter.execute(self.args.inline_direct, fetch=True, limit=limit)
133
+
134
+ output = io.StringIO()
135
+ if self.args.output == "json":
136
+ table.to_json(path=output)
137
+ else:
138
+ table.print_table(output=output, max_rows=None)
139
+
140
+ fire_event(
141
+ ShowNode(
142
+ node_name="direct-query",
143
+ preview=output.getvalue(),
144
+ is_inline=True,
145
+ output_format=self.args.output,
146
+ unique_id="direct-query",
147
+ quiet=get_flags().QUIET,
148
+ )
149
+ )
dbt/task/snapshot.py ADDED
@@ -0,0 +1,56 @@
1
+ from typing import Optional, Type
2
+
3
+ from dbt.artifacts.schemas.results import NodeStatus
4
+ from dbt.events.types import LogSnapshotResult
5
+ from dbt.graph import ResourceTypeSelector
6
+ from dbt.node_types import NodeType
7
+ from dbt.task import group_lookup
8
+ from dbt.task.base import BaseRunner
9
+ from dbt.task.run import ModelRunner, RunTask
10
+ from dbt_common.events.base_types import EventLevel
11
+ from dbt_common.events.functions import fire_event
12
+ from dbt_common.exceptions import DbtInternalError
13
+ from dbt_common.utils import cast_dict_to_dict_of_strings
14
+
15
+
16
+ class SnapshotRunner(ModelRunner):
17
+ def describe_node(self) -> str:
18
+ return "snapshot {}".format(self.get_node_representation())
19
+
20
+ def print_result_line(self, result):
21
+ model = result.node
22
+ group = group_lookup.get(model.unique_id)
23
+ cfg = model.config.to_dict(omit_none=True)
24
+ level = EventLevel.ERROR if result.status == NodeStatus.Error else EventLevel.INFO
25
+ fire_event(
26
+ LogSnapshotResult(
27
+ status=result.status,
28
+ description=self.get_node_representation(),
29
+ cfg=cast_dict_to_dict_of_strings(cfg),
30
+ index=self.node_index,
31
+ total=self.num_nodes,
32
+ execution_time=result.execution_time,
33
+ node_info=model.node_info,
34
+ result_message=result.message,
35
+ group=group,
36
+ ),
37
+ level=level,
38
+ )
39
+
40
+
41
+ class SnapshotTask(RunTask):
42
+ def raise_on_first_error(self) -> bool:
43
+ return False
44
+
45
+ def get_node_selector(self):
46
+ if self.manifest is None or self.graph is None:
47
+ raise DbtInternalError("manifest and graph must be set to get perform node selection")
48
+ return ResourceTypeSelector(
49
+ graph=self.graph,
50
+ manifest=self.manifest,
51
+ previous_state=self.previous_state,
52
+ resource_types=[NodeType.Snapshot],
53
+ )
54
+
55
+ def get_runner_type(self, _) -> Optional[Type[BaseRunner]]:
56
+ return SnapshotRunner