dvt-core 0.59.0a51__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.
- dbt/__init__.py +7 -0
- dbt/_pydantic_shim.py +26 -0
- dbt/artifacts/__init__.py +0 -0
- dbt/artifacts/exceptions/__init__.py +1 -0
- dbt/artifacts/exceptions/schemas.py +31 -0
- dbt/artifacts/resources/__init__.py +116 -0
- dbt/artifacts/resources/base.py +67 -0
- dbt/artifacts/resources/types.py +93 -0
- dbt/artifacts/resources/v1/analysis.py +10 -0
- dbt/artifacts/resources/v1/catalog.py +23 -0
- dbt/artifacts/resources/v1/components.py +274 -0
- dbt/artifacts/resources/v1/config.py +277 -0
- dbt/artifacts/resources/v1/documentation.py +11 -0
- dbt/artifacts/resources/v1/exposure.py +51 -0
- dbt/artifacts/resources/v1/function.py +52 -0
- dbt/artifacts/resources/v1/generic_test.py +31 -0
- dbt/artifacts/resources/v1/group.py +21 -0
- dbt/artifacts/resources/v1/hook.py +11 -0
- dbt/artifacts/resources/v1/macro.py +29 -0
- dbt/artifacts/resources/v1/metric.py +172 -0
- dbt/artifacts/resources/v1/model.py +145 -0
- dbt/artifacts/resources/v1/owner.py +10 -0
- dbt/artifacts/resources/v1/saved_query.py +111 -0
- dbt/artifacts/resources/v1/seed.py +41 -0
- dbt/artifacts/resources/v1/semantic_layer_components.py +72 -0
- dbt/artifacts/resources/v1/semantic_model.py +314 -0
- dbt/artifacts/resources/v1/singular_test.py +14 -0
- dbt/artifacts/resources/v1/snapshot.py +91 -0
- dbt/artifacts/resources/v1/source_definition.py +84 -0
- dbt/artifacts/resources/v1/sql_operation.py +10 -0
- dbt/artifacts/resources/v1/unit_test_definition.py +77 -0
- dbt/artifacts/schemas/__init__.py +0 -0
- dbt/artifacts/schemas/base.py +191 -0
- dbt/artifacts/schemas/batch_results.py +24 -0
- dbt/artifacts/schemas/catalog/__init__.py +11 -0
- dbt/artifacts/schemas/catalog/v1/__init__.py +0 -0
- dbt/artifacts/schemas/catalog/v1/catalog.py +59 -0
- dbt/artifacts/schemas/freshness/__init__.py +1 -0
- dbt/artifacts/schemas/freshness/v3/__init__.py +0 -0
- dbt/artifacts/schemas/freshness/v3/freshness.py +158 -0
- dbt/artifacts/schemas/manifest/__init__.py +2 -0
- dbt/artifacts/schemas/manifest/v12/__init__.py +0 -0
- dbt/artifacts/schemas/manifest/v12/manifest.py +211 -0
- dbt/artifacts/schemas/results.py +147 -0
- dbt/artifacts/schemas/run/__init__.py +2 -0
- dbt/artifacts/schemas/run/v5/__init__.py +0 -0
- dbt/artifacts/schemas/run/v5/run.py +184 -0
- dbt/artifacts/schemas/upgrades/__init__.py +4 -0
- dbt/artifacts/schemas/upgrades/upgrade_manifest.py +174 -0
- dbt/artifacts/schemas/upgrades/upgrade_manifest_dbt_version.py +2 -0
- dbt/artifacts/utils/validation.py +153 -0
- dbt/cli/__init__.py +1 -0
- dbt/cli/context.py +17 -0
- dbt/cli/exceptions.py +57 -0
- dbt/cli/flags.py +560 -0
- dbt/cli/main.py +2660 -0
- dbt/cli/option_types.py +121 -0
- dbt/cli/options.py +80 -0
- dbt/cli/params.py +844 -0
- dbt/cli/requires.py +490 -0
- dbt/cli/resolvers.py +60 -0
- dbt/cli/types.py +40 -0
- dbt/clients/__init__.py +0 -0
- dbt/clients/checked_load.py +83 -0
- dbt/clients/git.py +164 -0
- dbt/clients/jinja.py +206 -0
- dbt/clients/jinja_static.py +245 -0
- dbt/clients/registry.py +192 -0
- dbt/clients/yaml_helper.py +68 -0
- dbt/compilation.py +876 -0
- dbt/compute/__init__.py +14 -0
- dbt/compute/engines/__init__.py +12 -0
- dbt/compute/engines/spark_engine.py +642 -0
- dbt/compute/federated_executor.py +1080 -0
- dbt/compute/filter_pushdown.py +273 -0
- dbt/compute/jar_provisioning.py +273 -0
- dbt/compute/java_compat.py +689 -0
- dbt/compute/jdbc_utils.py +1252 -0
- dbt/compute/metadata/__init__.py +63 -0
- dbt/compute/metadata/adapters_registry.py +370 -0
- dbt/compute/metadata/catalog_store.py +1036 -0
- dbt/compute/metadata/registry.py +674 -0
- dbt/compute/metadata/store.py +1020 -0
- dbt/compute/smart_selector.py +377 -0
- dbt/compute/spark_logger.py +272 -0
- dbt/compute/strategies/__init__.py +55 -0
- dbt/compute/strategies/base.py +165 -0
- dbt/compute/strategies/dataproc.py +207 -0
- dbt/compute/strategies/emr.py +203 -0
- dbt/compute/strategies/local.py +472 -0
- dbt/compute/strategies/standalone.py +262 -0
- dbt/config/__init__.py +4 -0
- dbt/config/catalogs.py +94 -0
- dbt/config/compute.py +513 -0
- dbt/config/dvt_profile.py +408 -0
- dbt/config/profile.py +422 -0
- dbt/config/project.py +888 -0
- dbt/config/project_utils.py +48 -0
- dbt/config/renderer.py +231 -0
- dbt/config/runtime.py +564 -0
- dbt/config/selectors.py +208 -0
- dbt/config/utils.py +77 -0
- dbt/constants.py +28 -0
- dbt/context/__init__.py +0 -0
- dbt/context/base.py +745 -0
- dbt/context/configured.py +135 -0
- dbt/context/context_config.py +382 -0
- dbt/context/docs.py +82 -0
- dbt/context/exceptions_jinja.py +178 -0
- dbt/context/macro_resolver.py +195 -0
- dbt/context/macros.py +171 -0
- dbt/context/manifest.py +72 -0
- dbt/context/providers.py +2249 -0
- dbt/context/query_header.py +13 -0
- dbt/context/secret.py +58 -0
- dbt/context/target.py +74 -0
- dbt/contracts/__init__.py +0 -0
- dbt/contracts/files.py +413 -0
- dbt/contracts/graph/__init__.py +0 -0
- dbt/contracts/graph/manifest.py +1904 -0
- dbt/contracts/graph/metrics.py +97 -0
- dbt/contracts/graph/model_config.py +70 -0
- dbt/contracts/graph/node_args.py +42 -0
- dbt/contracts/graph/nodes.py +1806 -0
- dbt/contracts/graph/semantic_manifest.py +232 -0
- dbt/contracts/graph/unparsed.py +811 -0
- dbt/contracts/project.py +419 -0
- dbt/contracts/results.py +53 -0
- dbt/contracts/selection.py +23 -0
- dbt/contracts/sql.py +85 -0
- dbt/contracts/state.py +68 -0
- dbt/contracts/util.py +46 -0
- dbt/deprecations.py +348 -0
- dbt/deps/__init__.py +0 -0
- dbt/deps/base.py +152 -0
- dbt/deps/git.py +195 -0
- dbt/deps/local.py +79 -0
- dbt/deps/registry.py +130 -0
- dbt/deps/resolver.py +149 -0
- dbt/deps/tarball.py +120 -0
- dbt/docs/source/_ext/dbt_click.py +119 -0
- dbt/docs/source/conf.py +32 -0
- dbt/env_vars.py +64 -0
- dbt/event_time/event_time.py +40 -0
- dbt/event_time/sample_window.py +60 -0
- dbt/events/__init__.py +15 -0
- dbt/events/base_types.py +36 -0
- dbt/events/core_types_pb2.py +2 -0
- dbt/events/logging.py +108 -0
- dbt/events/types.py +2516 -0
- dbt/exceptions.py +1486 -0
- dbt/flags.py +89 -0
- dbt/graph/__init__.py +11 -0
- dbt/graph/cli.py +249 -0
- dbt/graph/graph.py +172 -0
- dbt/graph/queue.py +214 -0
- dbt/graph/selector.py +374 -0
- dbt/graph/selector_methods.py +975 -0
- dbt/graph/selector_spec.py +222 -0
- dbt/graph/thread_pool.py +18 -0
- dbt/hooks.py +21 -0
- dbt/include/README.md +49 -0
- dbt/include/__init__.py +3 -0
- dbt/include/data/adapters_registry.duckdb +0 -0
- dbt/include/data/build_comprehensive_registry.py +1254 -0
- dbt/include/data/build_registry.py +242 -0
- dbt/include/data/csv/adapter_queries.csv +33 -0
- dbt/include/data/csv/syntax_rules.csv +9 -0
- dbt/include/data/csv/type_mappings_bigquery.csv +28 -0
- dbt/include/data/csv/type_mappings_databricks.csv +30 -0
- dbt/include/data/csv/type_mappings_mysql.csv +40 -0
- dbt/include/data/csv/type_mappings_oracle.csv +30 -0
- dbt/include/data/csv/type_mappings_postgres.csv +56 -0
- dbt/include/data/csv/type_mappings_redshift.csv +33 -0
- dbt/include/data/csv/type_mappings_snowflake.csv +38 -0
- dbt/include/data/csv/type_mappings_sqlserver.csv +35 -0
- dbt/include/dvt_starter_project/README.md +15 -0
- dbt/include/dvt_starter_project/__init__.py +3 -0
- dbt/include/dvt_starter_project/analyses/PLACEHOLDER +0 -0
- dbt/include/dvt_starter_project/dvt_project.yml +39 -0
- dbt/include/dvt_starter_project/logs/PLACEHOLDER +0 -0
- dbt/include/dvt_starter_project/macros/PLACEHOLDER +0 -0
- dbt/include/dvt_starter_project/models/example/my_first_dbt_model.sql +27 -0
- dbt/include/dvt_starter_project/models/example/my_second_dbt_model.sql +6 -0
- dbt/include/dvt_starter_project/models/example/schema.yml +21 -0
- dbt/include/dvt_starter_project/seeds/PLACEHOLDER +0 -0
- dbt/include/dvt_starter_project/snapshots/PLACEHOLDER +0 -0
- dbt/include/dvt_starter_project/tests/PLACEHOLDER +0 -0
- dbt/internal_deprecations.py +26 -0
- dbt/jsonschemas/__init__.py +3 -0
- dbt/jsonschemas/jsonschemas.py +309 -0
- dbt/jsonschemas/project/0.0.110.json +4717 -0
- dbt/jsonschemas/project/0.0.85.json +2015 -0
- dbt/jsonschemas/resources/0.0.110.json +2636 -0
- dbt/jsonschemas/resources/0.0.85.json +2536 -0
- dbt/jsonschemas/resources/latest.json +6773 -0
- dbt/links.py +4 -0
- dbt/materializations/__init__.py +0 -0
- dbt/materializations/incremental/__init__.py +0 -0
- dbt/materializations/incremental/microbatch.py +236 -0
- dbt/mp_context.py +8 -0
- dbt/node_types.py +37 -0
- dbt/parser/__init__.py +23 -0
- dbt/parser/analysis.py +21 -0
- dbt/parser/base.py +548 -0
- dbt/parser/common.py +266 -0
- dbt/parser/docs.py +52 -0
- dbt/parser/fixtures.py +51 -0
- dbt/parser/functions.py +30 -0
- dbt/parser/generic_test.py +100 -0
- dbt/parser/generic_test_builders.py +333 -0
- dbt/parser/hooks.py +122 -0
- dbt/parser/macros.py +137 -0
- dbt/parser/manifest.py +2208 -0
- dbt/parser/models.py +573 -0
- dbt/parser/partial.py +1178 -0
- dbt/parser/read_files.py +445 -0
- dbt/parser/schema_generic_tests.py +422 -0
- dbt/parser/schema_renderer.py +111 -0
- dbt/parser/schema_yaml_readers.py +935 -0
- dbt/parser/schemas.py +1466 -0
- dbt/parser/search.py +149 -0
- dbt/parser/seeds.py +28 -0
- dbt/parser/singular_test.py +20 -0
- dbt/parser/snapshots.py +44 -0
- dbt/parser/sources.py +558 -0
- dbt/parser/sql.py +62 -0
- dbt/parser/unit_tests.py +621 -0
- dbt/plugins/__init__.py +20 -0
- dbt/plugins/contracts.py +9 -0
- dbt/plugins/exceptions.py +2 -0
- dbt/plugins/manager.py +163 -0
- dbt/plugins/manifest.py +21 -0
- dbt/profiler.py +20 -0
- dbt/py.typed +1 -0
- dbt/query_analyzer.py +410 -0
- dbt/runners/__init__.py +2 -0
- dbt/runners/exposure_runner.py +7 -0
- dbt/runners/no_op_runner.py +45 -0
- dbt/runners/saved_query_runner.py +7 -0
- dbt/selected_resources.py +8 -0
- dbt/task/__init__.py +0 -0
- dbt/task/base.py +506 -0
- dbt/task/build.py +197 -0
- dbt/task/clean.py +56 -0
- dbt/task/clone.py +161 -0
- dbt/task/compile.py +150 -0
- dbt/task/compute.py +458 -0
- dbt/task/debug.py +513 -0
- dbt/task/deps.py +280 -0
- dbt/task/docs/__init__.py +3 -0
- dbt/task/docs/api/__init__.py +23 -0
- dbt/task/docs/api/catalog.py +204 -0
- dbt/task/docs/api/lineage.py +234 -0
- dbt/task/docs/api/profile.py +204 -0
- dbt/task/docs/api/spark.py +186 -0
- dbt/task/docs/generate.py +1002 -0
- dbt/task/docs/index.html +250 -0
- dbt/task/docs/serve.py +174 -0
- dbt/task/dvt_output.py +509 -0
- dbt/task/dvt_run.py +282 -0
- dbt/task/dvt_seed.py +806 -0
- dbt/task/freshness.py +322 -0
- dbt/task/function.py +121 -0
- dbt/task/group_lookup.py +46 -0
- dbt/task/init.py +1022 -0
- dbt/task/java.py +316 -0
- dbt/task/list.py +236 -0
- dbt/task/metadata.py +804 -0
- dbt/task/migrate.py +714 -0
- dbt/task/printer.py +175 -0
- dbt/task/profile.py +1489 -0
- dbt/task/profile_serve.py +662 -0
- dbt/task/retract.py +441 -0
- dbt/task/retry.py +175 -0
- dbt/task/run.py +1647 -0
- dbt/task/run_operation.py +141 -0
- dbt/task/runnable.py +758 -0
- dbt/task/seed.py +103 -0
- dbt/task/show.py +149 -0
- dbt/task/snapshot.py +56 -0
- dbt/task/spark.py +414 -0
- dbt/task/sql.py +110 -0
- dbt/task/target_sync.py +814 -0
- dbt/task/test.py +464 -0
- dbt/tests/fixtures/__init__.py +1 -0
- dbt/tests/fixtures/project.py +620 -0
- dbt/tests/util.py +651 -0
- dbt/tracking.py +529 -0
- dbt/utils/__init__.py +3 -0
- dbt/utils/artifact_upload.py +151 -0
- dbt/utils/utils.py +408 -0
- dbt/version.py +271 -0
- dvt_cli/__init__.py +158 -0
- dvt_core-0.59.0a51.dist-info/METADATA +288 -0
- dvt_core-0.59.0a51.dist-info/RECORD +299 -0
- dvt_core-0.59.0a51.dist-info/WHEEL +5 -0
- dvt_core-0.59.0a51.dist-info/entry_points.txt +2 -0
- dvt_core-0.59.0a51.dist-info/top_level.txt +2 -0
dbt/parser/search.py
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from dataclasses import dataclass
|
|
3
|
+
from typing import (
|
|
4
|
+
Callable,
|
|
5
|
+
Generic,
|
|
6
|
+
Iterable,
|
|
7
|
+
Iterator,
|
|
8
|
+
List,
|
|
9
|
+
Optional,
|
|
10
|
+
Set,
|
|
11
|
+
TypeVar,
|
|
12
|
+
Union,
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
from pathspec import PathSpec # type: ignore
|
|
16
|
+
|
|
17
|
+
from dbt import deprecations
|
|
18
|
+
from dbt.config import Project
|
|
19
|
+
from dbt.contracts.files import AnySourceFile, FilePath
|
|
20
|
+
from dbt.exceptions import DbtInternalError, ParsingError
|
|
21
|
+
from dbt_common.clients._jinja_blocks import ExtractWarning
|
|
22
|
+
from dbt_common.clients.jinja import BlockTag, extract_toplevel_blocks
|
|
23
|
+
from dbt_common.clients.system import find_matching
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# What's the point of wrapping a SourceFile with this class?
|
|
27
|
+
# Could it be removed?
|
|
28
|
+
@dataclass
|
|
29
|
+
class FileBlock:
|
|
30
|
+
file: AnySourceFile
|
|
31
|
+
|
|
32
|
+
@property
|
|
33
|
+
def name(self):
|
|
34
|
+
base = os.path.basename(self.file.path.relative_path)
|
|
35
|
+
name, _ = os.path.splitext(base)
|
|
36
|
+
return name
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def contents(self):
|
|
40
|
+
return self.file.contents
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def path(self):
|
|
44
|
+
return self.file.path
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
# The BlockTag is used in Jinja processing
|
|
48
|
+
# Why do we have different classes where the only
|
|
49
|
+
# difference is what 'contents' returns?
|
|
50
|
+
@dataclass
|
|
51
|
+
class BlockContents(FileBlock):
|
|
52
|
+
file: AnySourceFile # if you remove this, mypy will get upset
|
|
53
|
+
block: BlockTag
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def name(self):
|
|
57
|
+
return self.block.block_name
|
|
58
|
+
|
|
59
|
+
@property
|
|
60
|
+
def contents(self):
|
|
61
|
+
return self.block.contents
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
@dataclass
|
|
65
|
+
class FullBlock(FileBlock):
|
|
66
|
+
file: AnySourceFile # if you remove this, mypy will get upset
|
|
67
|
+
block: BlockTag
|
|
68
|
+
|
|
69
|
+
@property
|
|
70
|
+
def name(self):
|
|
71
|
+
return self.block.block_name
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def contents(self):
|
|
75
|
+
return self.block.full_block
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def filesystem_search(
|
|
79
|
+
project: Project,
|
|
80
|
+
relative_dirs: List[str],
|
|
81
|
+
extension: str,
|
|
82
|
+
ignore_spec: Optional[PathSpec] = None,
|
|
83
|
+
):
|
|
84
|
+
ext = "[!.#~]*" + extension
|
|
85
|
+
root = project.project_root
|
|
86
|
+
file_path_list = []
|
|
87
|
+
for result in find_matching(root, relative_dirs, ext, ignore_spec):
|
|
88
|
+
if "searched_path" not in result or "relative_path" not in result:
|
|
89
|
+
raise DbtInternalError("Invalid result from find_matching: {}".format(result))
|
|
90
|
+
file_match = FilePath(
|
|
91
|
+
searched_path=result["searched_path"],
|
|
92
|
+
relative_path=result["relative_path"],
|
|
93
|
+
modification_time=result["modification_time"],
|
|
94
|
+
project_root=root,
|
|
95
|
+
)
|
|
96
|
+
file_path_list.append(file_match)
|
|
97
|
+
|
|
98
|
+
return file_path_list
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
Block = Union[BlockContents, FullBlock]
|
|
102
|
+
|
|
103
|
+
BlockSearchResult = TypeVar("BlockSearchResult", BlockContents, FullBlock)
|
|
104
|
+
|
|
105
|
+
BlockSearchResultFactory = Callable[[AnySourceFile, BlockTag], BlockSearchResult]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class BlockSearcher(Generic[BlockSearchResult], Iterable[BlockSearchResult]):
|
|
109
|
+
def __init__(
|
|
110
|
+
self,
|
|
111
|
+
source: List[FileBlock],
|
|
112
|
+
allowed_blocks: Set[str],
|
|
113
|
+
source_tag_factory: BlockSearchResultFactory,
|
|
114
|
+
check_jinja: bool = True,
|
|
115
|
+
) -> None:
|
|
116
|
+
self.source = source
|
|
117
|
+
self.allowed_blocks = allowed_blocks
|
|
118
|
+
self.source_tag_factory: BlockSearchResultFactory = source_tag_factory
|
|
119
|
+
self.check_jinja = check_jinja
|
|
120
|
+
|
|
121
|
+
def extract_blocks(self, source_file: FileBlock) -> Iterable[BlockTag]:
|
|
122
|
+
# This is a bit of a hack to get the file path to the deprecation
|
|
123
|
+
def wrap_handle_extract_warning(warning: ExtractWarning) -> None:
|
|
124
|
+
self._handle_extract_warning(warning=warning, file=source_file.path.relative_path)
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
blocks = extract_toplevel_blocks(
|
|
128
|
+
source_file.contents,
|
|
129
|
+
allowed_blocks=self.allowed_blocks,
|
|
130
|
+
collect_raw_data=False,
|
|
131
|
+
warning_callback=wrap_handle_extract_warning if self.check_jinja else None,
|
|
132
|
+
)
|
|
133
|
+
# this makes mypy happy, and this is an invariant we really need
|
|
134
|
+
for block in blocks:
|
|
135
|
+
assert isinstance(block, BlockTag)
|
|
136
|
+
yield block
|
|
137
|
+
|
|
138
|
+
except ParsingError as exc:
|
|
139
|
+
if exc.node is None:
|
|
140
|
+
exc.add_node(source_file)
|
|
141
|
+
raise
|
|
142
|
+
|
|
143
|
+
def _handle_extract_warning(self, warning: ExtractWarning, file: str) -> None:
|
|
144
|
+
deprecations.warn("unexpected-jinja-block-deprecation", msg=warning.msg, file=file)
|
|
145
|
+
|
|
146
|
+
def __iter__(self) -> Iterator[BlockSearchResult]:
|
|
147
|
+
for entry in self.source:
|
|
148
|
+
for block in self.extract_blocks(entry):
|
|
149
|
+
yield self.source_tag_factory(entry.file, block)
|
dbt/parser/seeds.py
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from dbt.context.context_config import ContextConfig
|
|
2
|
+
from dbt.contracts.graph.nodes import SeedNode
|
|
3
|
+
from dbt.node_types import NodeType
|
|
4
|
+
from dbt.parser.base import SimpleSQLParser
|
|
5
|
+
from dbt.parser.search import FileBlock
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SeedParser(SimpleSQLParser[SeedNode]):
|
|
9
|
+
def parse_from_dict(self, dct, validate=True) -> SeedNode:
|
|
10
|
+
# seeds need the root_path because the contents are not loaded
|
|
11
|
+
dct["root_path"] = self.project.project_root
|
|
12
|
+
if "language" in dct:
|
|
13
|
+
del dct["language"]
|
|
14
|
+
# raw_code is not currently used, but it might be in the future
|
|
15
|
+
if validate:
|
|
16
|
+
SeedNode.validate(dct)
|
|
17
|
+
return SeedNode.from_dict(dct)
|
|
18
|
+
|
|
19
|
+
@property
|
|
20
|
+
def resource_type(self) -> NodeType:
|
|
21
|
+
return NodeType.Seed
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def get_compiled_path(cls, block: FileBlock):
|
|
25
|
+
return block.path.relative_path
|
|
26
|
+
|
|
27
|
+
def render_with_context(self, parsed_node: SeedNode, config: ContextConfig) -> None:
|
|
28
|
+
"""Seeds don't need to do any rendering."""
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from dbt.contracts.graph.nodes import SingularTestNode
|
|
2
|
+
from dbt.node_types import NodeType
|
|
3
|
+
from dbt.parser.base import SimpleSQLParser
|
|
4
|
+
from dbt.parser.search import FileBlock
|
|
5
|
+
from dbt.utils import get_pseudo_test_path
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SingularTestParser(SimpleSQLParser[SingularTestNode]):
|
|
9
|
+
def parse_from_dict(self, dct, validate=True) -> SingularTestNode:
|
|
10
|
+
if validate:
|
|
11
|
+
SingularTestNode.validate(dct)
|
|
12
|
+
return SingularTestNode.from_dict(dct)
|
|
13
|
+
|
|
14
|
+
@property
|
|
15
|
+
def resource_type(self) -> NodeType:
|
|
16
|
+
return NodeType.Test
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def get_compiled_path(cls, block: FileBlock):
|
|
20
|
+
return get_pseudo_test_path(block.name, block.path.relative_path)
|
dbt/parser/snapshots.py
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from dbt.contracts.graph.nodes import SnapshotNode
|
|
5
|
+
from dbt.node_types import NodeType
|
|
6
|
+
from dbt.parser.base import SQLParser
|
|
7
|
+
from dbt.parser.search import BlockContents, BlockSearcher, FileBlock
|
|
8
|
+
from dbt.utils import split_path
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class SnapshotParser(SQLParser[SnapshotNode]):
|
|
12
|
+
def parse_from_dict(self, dct, validate=True) -> SnapshotNode:
|
|
13
|
+
if validate:
|
|
14
|
+
SnapshotNode.validate(dct)
|
|
15
|
+
return SnapshotNode.from_dict(dct)
|
|
16
|
+
|
|
17
|
+
@property
|
|
18
|
+
def resource_type(self) -> NodeType:
|
|
19
|
+
return NodeType.Snapshot
|
|
20
|
+
|
|
21
|
+
@classmethod
|
|
22
|
+
def get_compiled_path(cls, block: FileBlock):
|
|
23
|
+
return block.path.relative_path
|
|
24
|
+
|
|
25
|
+
def get_fqn(self, path: str, name: str) -> List[str]:
|
|
26
|
+
"""Get the FQN for the node. This impacts node selection and config
|
|
27
|
+
application.
|
|
28
|
+
|
|
29
|
+
On snapshots, the fqn includes the filename.
|
|
30
|
+
"""
|
|
31
|
+
no_ext = os.path.splitext(path)[0]
|
|
32
|
+
fqn = [self.project.project_name]
|
|
33
|
+
fqn.extend(split_path(no_ext))
|
|
34
|
+
fqn.append(name)
|
|
35
|
+
return fqn
|
|
36
|
+
|
|
37
|
+
def parse_file(self, file_block: FileBlock) -> None:
|
|
38
|
+
blocks = BlockSearcher(
|
|
39
|
+
source=[file_block],
|
|
40
|
+
allowed_blocks={"snapshot"},
|
|
41
|
+
source_tag_factory=BlockContents,
|
|
42
|
+
)
|
|
43
|
+
for block in blocks:
|
|
44
|
+
self.parse_node(block)
|